데이터에서 사용자의 크리덴셜을 조회하고 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)번 항목 참조