경주장

[인증 API]익명사용자 인증 필터 : AnoymousAuthenticationFilter 본문

스프링/스프링 시큐리티

[인증 API]익명사용자 인증 필터 : AnoymousAuthenticationFilter

달리는치타 2022. 2. 6. 17:53
익명사용자 인증 처리 필터
익명사용자와 인증 사용자를 구분해서 처리하기 위한 용도로 사용
화면에서 인증 여부를 구현할 때 isAnonymous() isAuthenticated() 로 구분해서 사용
인증객체를 세션에 저장하지 않는다 -> SecurityContext에 저장한다.
 

 

다른 필터에 비해 역할이 꽤 간단하다.
인증된 사용자와 익명 사용자를 조금 더 명확하게 구분하기 위해 익명사용자라 할지라도 인증객체를 null이아닌 익명사용자용 인증객체를 설정하는 역할을 한다.
 
AnoymousAuthenticationFilter의 doFilter
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    if (SecurityContextHolder에 Authencation 객체가 null 이라면) {
        Authentication authentication = createAuthentication((HttpServletRequest)req); //요청을 통해 인증객체를 생성하고
        
        SecurityContext context = SecurityContextHolder.createEmptyContext();
        context.setAuthentication(authentication);
        SecurityContextHolder.setContext(context); //이를 SecurityContext 및 SecurityContextHolder에 설정한다.
        
    } 

    chain.doFilter(req, res);
}

 

생성된 익명사용자용 인증 객체 

 

AnoymousAuthenticationFilter에서 익명사용자용 인증 객체를 설정하기때문에 

예외 처리를 진행하는 마지막 필터인 AbstractSecurityInterceptor에서는 인증객체가 비어있다면 credentialsNotFound 예외가 발생하는 구문이 있습니다.

 

if (SecurityContextHolder.getContext().getAuthentication() == null) {
    this.credentialsNotFound(this.messages.getMessage("AbstractSecurityInterceptor.authenticationNotFound", "An Authentication object was not found in the SecurityContext"), object, attributes);
}

AbstractSecurityInterceptor.InterceptorStatusToken( )