@Component
@RequiredArgsConstructor
@Slf4j
public class UsernamePasswordAuthenticationProvider implements AuthenticationProvider {
private final UserRepository userRepository; // 사용자 정보를 조회하기 위한 객체
private final PasswordEncoder passwordEncoder; // 패스워드 암호화 객체 --> SecurityConfig에서 빈으로 등록된 객체 사용
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName(); // 사용자가 입력한 ID
String password = authentication.getCredentials().toString(); // 사용자가 입력한 패스워드
log.info("================== username: {}, password: {}", username, password);
Optional<User> findUser = userRepository.findByEmail(username); // 사용자 정보 조회
log.info("================== findUser: {}", findUser);
if(findUser.isPresent()) { // 사용자 정보가 존재하는 경우
if(passwordEncoder.matches(password, findUser.get().getPassword())) { // 패스워드 일치 여부 확인
List<GrantedAuthority> authorities = new ArrayList<>(); // 사용자의 권한 정보
authorities.add(new SimpleGrantedAuthority(findUser.get().getRole())); // 사용자의 권한 정보 추가
return new UsernamePasswordAuthenticationToken(username, password, authorities); // 인증 성공
} else {
throw new BadCredentialsException("비밀번호가 일치하지 않습니다."); // 패스워드 불일치
}
} else {
throw new BadCredentialsException("존재하지 않는 사용자입니다.."); // 사용자 정보가 존재하지 않음
}
}
@Override
public boolean supports(Class<?> authentication) {
return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}
}