데이터에서 사용자의 크리덴셜을 조회하고 AuthenticationManager에게 전달하는 역할

코드 예시

@Component
@RequiredArgsConstructor
public class MemberDetailService implements UserDetailsService {
    private final MemberRepository memberRepository;
    private final CustomAuthorityUtils authorityUtils;

    // 이메일로 MemberDetail 조회
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Member> optionalMember = memberRepository.findByEmail(username);
        Member member = optionalMember.orElseThrow(() -> new BusinessLogicException(ExceptionType.MEMBER_NOT_FOUND));

        return new MemberDetails(member);
    }

		// UserDetails 구현체 선언
    private final class MemberDetails extends Member implements UserDetails{
        MemberDetails(Member member) {
            setId(member.getId());
            setEmail(member.getEmail());
            setPassword(member.getPassword());
            setRoles(member.getRoles());
            setNickname(member.getNickname());
        }

        // 사용자 권한 목록 반환
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return authorityUtils.createAuthorities(this.getRoles());
        }

        @Override
        public String getUsername() {
            return getEmail();
        }

        // 만료되지 않은 계정인지 검사 (계정 만료 기능 미사용)
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }

        // 계정 잠김 상태 검사(계정 잠금 기능 미사용)
        // 의심스러운 로그인 시도 등 보안 위험 시 자동 잠금 기능 사용 가능
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }

        // 크리덴셜 만료 상태 검사(크리덴셜 만료 미사용)
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }

        // 계정 활성화 여부 검사(계정 비활성화 기능 미사용)
        // 직원 퇴사 및 회원 제재 등 반영구적 계정 비활성화 시 사용 가능
        @Override
        public boolean isEnabled() {
            return true;
        }
    }
}

해당 서비스는 로그인 시에 호출됨

IDE에 의해 no usage로 표시되더라도 정상

사용자가 직접 호출하는 것이 아닌, 빈으로 등록해 두면 스프링 컨테이너가 DaoAuthenticationProvider를 초기화할 때 자동으로 주입함

만약 커스텀 AuthenticationProvider를 적용할 경우 직접 생성자 주입받고 호출해야 함

기본 인증 처리 흐름

해당 문서의 (5), (6)번 항목 참조

의존성

CustomAuthorityUtils (Role ↔ GrantedAuthority 변환기)