AuditorAware 사용하여 사용자정보 자동 입력

0

TIL

목록 보기
157/183

프로젝트를 진행하며 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()를 반환하여 현재 감사자가 없음을 나타낸다.

0개의 댓글

관련 채용 정보