게시글
질문&답변
2023.02.19
Spring Boot 최신 3.XX 버전 Security 설정 공유드립니다.
감사합니다! pattern /** 은 모든 경로에 대해서 허용해주는게 조금 아쉬어서 h2 에 대해서만 추가로 적용되게 찾아봤는데요.h2의 경우 pattern "/h2-console" 등록을 해도 403으로 뜨는데 PathRequest.toH2Console() 을 사용하면 자동으로 올바른 경로를 찾아주네요.@Bean protected SecurityFilterChain config(HttpSecurity http) throws Exception { http.csrf().disable(); http.headers().frameOptions().disable(); http.authorizeHttpRequests(authorize -> authorize .requestMatchers("/users/**").permitAll() .requestMatchers(PathRequest.toH2Console()).permitAll() ); return http.build(); }(참고자료:https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.sql.h2-web-console.custom-path)
- 18
- 6
- 9.4K
고민있어요
2021.07.18 16:38
타입 컨버터 오타발견입니다.
- 1
- 1
- 149
질문&답변
2021.07.07
인터페이스 사용법 접근방식에 대한 의문점입니다!
위의 답변에 이어서 저는 구체적으로 어떻게 궁금증에 대한 해답을 찾는 가에 대해 설명해주고 싶네요. 질문하신대로 인터페이스의 함수선언부만 보고는 어떤 동작의 함수를 구현해야할지 모를 수 있습니다. 자바의 표준함수들은 이해를 돕기위한 주석이나 레퍼런스가 굉장히 친절하게 써져있습니다. 이걸 읽어보시면 됩니다. Filter 인터페이스에 써져있는 공식 주석으로 질문에 있는 내용을 전부 해결해 보겠습니다. 1. Filter.super.init(), Filter.super.destroy() 는 뭐지? init(), destroy()를 구현했더니 Filter.super.init(), Filter.super.destroy()를 IDE가 자동으로 호출했습니다. 디폴트 함수로 써져있기 때문이죠. '이걸 왜 디폴트 함수로 썼을까? 디폴트로 정의해 놓은 함수 내용이 뭘까?' 의도를 알고 싶으면 Filter 인터페이스를 열어보면 됩니다. 열어보니 init(), destroy()의 함수 내용은 공백입니다. 주석에는 "The default implementation is a NO-OP." 즉 기본 구현은 아무런 작업도 하지 않는다는 겁니다. Filter.super.init(); 을 지워도 상관없겠죠? 의도는 Filter를 구현할때 init()이나 destroy()를 사용하지 않을거면 귀찮게 override 하지 않아도 되도록 설정해 놓은 것입니다. 강의에서 만든 LogFilter에서 init()이나 destroy() 함수를 지워보시면 정상작동하는것을 알 수 있을겁니다. 2. HttpServletRequest로 다운 캐스팅은 어떻게 알까? ServletRequest 만으로는 원하는 기능을 이용할 수 없었습니다. 그래서, ServletRequest 인터페이스의 주석을 살펴봤습니다. 'Interfaces that extend ServletRequest can provide additional protocol-specific data (for example, HTTP data is provided by javax.servlet.http.HttpServletRequest.') HTTP 데이터를 이용하고자 하면 ServletRequest를 상속하는 HttpServletRequest를 사용하랍니다. 또, Filter의 doFilter() 함수에 다음과 같은 주석이 있습니다. "Optionally wrap the request object with a custom implementation to filter content or headers for input filtering". request 객체를 필요에 따라 캐스팅해서 쓰랍니다. 즉, HTTP 요청 정보들을 이용할 필요가 있으면 HttpServletRequest를 쓰면 되겠네요. ------------------------- 저도 배우는 입장이라 사전에 모르던 내용이었지만 주석을 읽어봄으로써 궁금증을 해결해 볼 수 있었습니다. 강의를 보고 추가적인 궁금증이 생기거나 사용법을 알고 싶으면 공식 레퍼런스를 참고해보면 좋을 것 같네요.
- 7
- 2
- 280