AuthorizationFilter?
- 인증된 요청이 특정 자원에 대한 접근 권한을 가지고 있는지 확인하는 역할임
- 스프링 필터 체인에 포함되어 잇음.
- 사용자의 요청이 처리되기 전에 해당 요청이 허용된 권한을 가진 사용자에 의해 이루어졌는지 검사한다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.
// 중략
.authorizeHttpRequests((authorize) -> authorize
.antMatchers("/", "/refresh-token", "/login")
.permitAll()
.anyRequest()
.authenticated()
)
//중략
return http.build();
}
authorize의 타입 → AbstractRequestMatcherRegistry
- authorizeHttpRequests 메서드는
public HttpSecurity authorizeHttpRequests( Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry> authorizeHttpRequestsCustomizer) throws Exception { ApplicationContext context = getContext(); authorizeHttpRequestsCustomizer .customize(getOrApply(new AuthorizeHttpRequestsConfigurer<>(context)).getRegistry()); return HttpSecurity.this; }
- 인자로 AuthorizationManagerRequestMatcherRegistry 를 받으며
Customizer
를 통해 람다식으로 인자를 받을 수 있게 된다..
- 인자로 AuthorizationManagerRequestMatcherRegistry 를 받으며
antMatchers 로 여러 URI 를 기입할 수 있는 이유?
- AbstractRequestMathcerRegistry.antMathers
public C antMatchers(String... antPatterns) { Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest"); return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns)); }
- 가변인자 설정으로 여럿 인자를 받을 수 있음.
- 그리고 패턴에 대해 별도 검증을 위해 여럿 메서드를 타고들어가는데, 거기서 현재 request uri 와 대조해 체크를 하는 것 같다.
permitAll()??
- AuthorizeHttpRequestsConfigurer.permitAll() 메서드
public AuthorizationManagerRequestMatcherRegistry permitAll() { return access(permitAllAuthorizationManager); }
- 메서드를 타고 들어가다 보면
AuthorizeHttpRequestsConfigurer
.addMapping 에서private AuthorizationManagerRequestMatcherRegistry addMapping(List<? extends RequestMatcher> matchers, AuthorizationManager<RequestAuthorizationContext> manager) { for (RequestMatcher matcher : matchers) { this.registry.addMapping(matcher, manager); } return this.registry; }
- registry
- 즉.
private final AuthorizationManagerRequestMatcherRegistry registry;
- 에 해당 매핑을 등록하게된다.
- registry
- 메서드를 타고 들어가다 보면
anyRequest()..?
- AbstractRequestMatcherRegistry.anyRequest()
public C anyRequest() { Assert.state(!this.anyRequestConfigured, "Can't configure anyRequest after itself"); C configurer = requestMatchers(ANY_REQUEST); this.anyRequestConfigured = true; return configurer; }
- 이전 필터에서 걸리지 않은 모든 요청을 의미한다.
- ANY_REQUEST 상수필드의 경우
public final class AnyRequestMatcher implements RequestMatcher { public static final RequestMatcher INSTANCE = new AnyRequestMatcher(); private AnyRequestMatcher() { } @Override public boolean matches(HttpServletRequest request) { return true; }
- 해당 클래스와 이어져있는데
- matches 메서드를 상속받고
- 항상
참
을 반환하는 것으로 보아..
- URI 대조시 무조건 필터가 적용됨을 가정하기 위함인것같다.
- 해당 클래스와 이어져있는데
this.anyRequestConfigured = true;
- 의 경우
- AbstractRequestMatherRegistry (추상 클래스에서) 곳곳에
public C antMatchers(String... antPatterns) { Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest"); return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns)); }
Assert.state(!this.anyRequestConfigured, "Can't configure antMatchers after anyRequest");
라는 실패조건의 분기가 걸려있는 것을 볼 수 있는데anyRequest() 체이닝 이후에는 어떠한 필터를 설정하더라도, 적용될 수 없으니, 빠른 실패를 시켜주는 것으로 보인다.
- ANY_REQUEST 상수필드의 경우
- 이전 필터에서 걸리지 않은 모든 요청을 의미한다.
Uploaded by N2T
'자바 > Spring Security' 카테고리의 다른 글
[JWT] 리프레쉬 토큰 - 엑세스 토큰 (0) | 2024.01.19 |
---|---|
[Security] PasswordEncoder..? (0) | 2024.01.19 |
[Spring Security] JwtAuthenticationFilter 관련 (0) | 2024.01.19 |
[Security] `@WithAnonymousUser` 의 역할 (0) | 2024.01.14 |