[Spring Security] Spring Security Basic - AnonymousAuthenticationFilter
들어가며
AnonymousAuthenticationFilter가 언제 생성되고 무슨 역할을 하는지 알아보자.
언제 생성 되는가?
@Override
public void init(H http) {
if (authenticationProvider == null) {
authenticationProvider = new AnonymousAuthenticationProvider(getKey());
}
if (authenticationFilter == null) {
authenticationFilter = new AnonymousAuthenticationFilter(getKey(), principal,
authorities);
}
authenticationProvider = postProcess(authenticationProvider);
http.authenticationProvider(authenticationProvider);
}
AnonymousConfigurer에서 init 부분에서AnonymousAuthenticationFilter가 생성이 된다.AnonymousAuthenticationFilter가 생성될 때 기본으로 셋팅되는 값들이 존재한다.- key는 UUID로 random으로 생성을 하고 principal은
anonymousUser, authorities는ROLE_ANONYMOUS로 기본값이 생성 된다. - key는
AnonymousAuthenticationFilter로 생성된 token인지 확인을 하기 위한 용도로 사용 된다.
무슨 역할을 하는가?
SeucotyContext에 Authentication이 null인 경우AnonymousAuthenticationToken을 주입해주는 역할을 담당한다.SecurityContext에 인증이 성공한 경우Authentication이ThreadLocal을 사용하여 저장이 되는 것을 이전 포스트에서 확인하였다.
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
if (SecurityContextHolder.getContext().getAuthentication() == null) {
SecurityContextHolder.getContext().setAuthentication(
createAuthentication((HttpServletRequest) req));
if (logger.isDebugEnabled()) {
logger.debug("Populated SecurityContextHolder with anonymous token: '"
+ SecurityContextHolder.getContext().getAuthentication() + "'");
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug("SecurityContextHolder not populated with anonymous token, as it already contained: '"
+ SecurityContextHolder.getContext().getAuthentication() + "'");
}
}
chain.doFilter(req, res);
}
Authentication이 null 인경우SecurityContextHolder에SecurityContext에 Authentication에 값을 채워주는 부분을 한다.- 만약 null이 아닌 경우 다음 필터로 진행 한다.
protected Authentication createAuthentication(HttpServletRequest request) {
AnonymousAuthenticationToken auth = new AnonymousAuthenticationToken(key,
principal, authorities);
auth.setDetails(authenticationDetailsSource.buildDetails(request));
return auth;
}
createAuthentication에서AnonymousAuthenticationToken을 생성한다.AnonymousAuthenticationToken을 생성하는 이유는 SecurityFilter에서 Authentication이 null인지 확인하는 부분을 없애고, null class인AnonymousAuthenticationToken을 이용해서 null인지 확인하게 된다.
private Class<? extends Authentication> anonymousClass = AnonymousAuthenticationToken.class;
public boolean isAnonymous(Authentication authentication) {
if ((anonymousClass == null) || (authentication == null)) {
return false;
}
return anonymousClass.isAssignableFrom(authentication.getClass());
}
AuthenticationTrustResolverImpl.isAnonymous부분을 보게 되면,Authentication이AnonymousAuthenticationToken인지 확인하는 부분이 존재한다.- 이런식으로 null인지 아닌지를 확인하는 것이 아닌, SpringSecurity에서는 null object를 이용해서 처리 하도록 설계가 된거 같다.
- null object pattern 참고
Leave a comment