프로젝트를 진행하며 UserDetailsImpl에서 접근한 사용자에 대한 정보를 가져와 접근에 대한 인증 기능으로 많이 사용하였었는데
security 부분에 약하다보니 나중에 로그인 기능을 제대로 구현해보기 전 미리 알아보기로 하였다.
@Component
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Optional<Object> auditor = Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getPrincipal);
if (auditor.get() instanceof String user) {
if (user.equals("anonymousUser")) return Optional.empty();
} else if (auditor.get() instanceof UserDetailsImpl user) {
return Optional.of(user.getUsername());
}
return Optional.empty();
}
}
SecurityContextHolder.getContext(): 현재 사용자의 보안 정보를 보유하는 SecurityContext를 검색한다.
getAuthentication(): 사용자에 대한 세부정보가 포함된 현재 'Authentication' 개체를 검색한다.
filter(Authentication::isAuthenticated): 사용자가 인증되었는지 확인하고, 그렇지 않은 경우 빈 Optional을 반환한다.
map(Authentication::getPrincipal): Authentication 객체에서 "principal"을 추출한다. 주체는 현재 로그인된 사용자를 나타낸다.
if문을 통해
anonymousUser 확인:
문자열 유형인 경우 코드는 사용자 이름이 인증되지 않은 사용자를 위한 Spring Security의 특수 식별자인 "anonymousUser"인지 확인한다. 일치한다면 Optional.empty()를 반환하고,
인증된 사용자라면 UserDetailsImpl 객체에서 사용자 이름을 추출하여 Optional에 래핑하여 반환한다.
위 조건문에 일치하는 조건이 없으면(즉, 유효한 사용자가 발견되지 않는 경우) 메서드는 Optional.empty()를 반환하여 현재 감사자가 없음을 나타낸다.