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());
	}