Java/Spring Boot Security
Spring boot Security 비밀번호 비교
바리새인
2024. 8. 15. 21:45
중요한 것은 DB에 저장되는 암호화된 값과 입력받은 값을 암호화하는 암호화 방식이 동일해야 함
DaoAuthenticationProvider에서 비밀번호 비교가 이루어짐
확인하기 위해서 커스텀 객체를 생성하여 환경설정에 추가
환경설정 파일
@Autowired
private MemberUserDetailService memberUserDetailService;
@Bean
public DaoAuthenticationProvider authProvider() {
CustomAuthenticationProvider authProvider = new CustomAuthenticationProvider();
authProvider.setUserDetailsService(memberUserDetailService);
# PasswordEncoder를 설정하면, 기존에 등록된 비밀번호들에 대해서 무조건 false 나옴
//authProvider.setPasswordEncoder(new BCryptPasswordEncoder());
return authProvider;
}
커스텀 파일
public class CustomAuthenticationProvider extends DaoAuthenticationProvider {
@Autowired
private MemberMapper memberMapper;
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
Member member = memberMapper.getMember(auth.getName());
if(member == null) {
throw new BadCredentialsException("Invalid username and password.");
} else {
# 값이 절대 일치하지 않음
log.debug(this.getPasswordEncoder().encode((CharSequence)auth.getCredentials()));
log.debug(member.getPasswd());
# '(CharSequence)auth.getCredentials()'일 경우에 match에서 일치함
if(this.getPasswordEncoder().matches((CharSequence)auth.getCredentials(), member.getPasswd())) {
# 결과값: false;
log.debug(Boolean.toString(auth.isAuthenticated()));
} else {
throw new BadCredentialsException("Invalid username and password.");
}
}
Authentication result = super.authenticate(auth);
# 결과값: true
log.debug(Boolean.toString(result.isAuthenticated()));
return new UsernamePasswordAuthenticationToken(member, result.getCredentials(), result.getAuthorities());
}