AuthenticationManager DB 기반 로그인 검증 로직
UserEntity findByUsername(String username);
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserEntity userData = userRepository.findByUsername(username);
if(userData != null) {
return new CustomUserDetails(userData);
}
return null;
}
}
public class CustomUserDetails implements UserDetails {
private final UserEntity userEntity;
public CustomUserDetails(UserEntity userEntity) {
this.userEntity = userEntity;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> collection = new ArrayList<>();
collection.add(new GrantedAuthority() {
@Override
public String getAuthority() {
return userEntity.getRole();
}
});
return collection;
}
@Override
public String getPassword() {
return userEntity.getPassword();
}
@Override
public String getUsername() {
return userEntity.getPassword();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
AuthenticationManager 역할
- 로그인 시 AuthenticationManager는 UserDetailsService를 통해 반환된 CustomUserDetails를 가지고 인증 과정을 진행합니다.
- AuthenticationManager는 UsernamePasswordAuthenticationToken을 기반으로 인증을 진행하고, CustomUserDetails에서 받은 사용자 정보(username, password, role)를 검증합니다.