Spring Security 설정 후 로그인을 해보면 아이디나 비밀번호가 틀려도 모두 BadCredentialException만 발생해서 두 가지 에러상황을 따로 처리할 수 없다. 해당 이슈를 구분할 수 있는 setHideUserNotFoundException설정이 기본 true로 설정되어있어 그렇다고한다. 더 강한 보안을 위해서 그렇다고 하는데 잘 이해가 안간다...
암튼 이 설정값은 AuthenticationProvider 생성 시에 false로 수정할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() {
DaoAuthenticationProvider bean = new DaoAuthenticationProvider();
bean.setHideUserNotFoundExceptions(false);
bean.setUserDetailsService(userDetailsService);
bean.setPasswordEncoder(passwordEncoder());
return bean;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(this.daoAuthenticationProvider());
}
|
cs |
Security Config 설정파일에서 AuthenticationProvider 생성 시 해당 값을 false로 지정한 뒤 적용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException e) throws IOException, ServletException {
String sErrMsg = "";
if (e instanceof UsernameNotFoundException) {
sErrMsg = "존재하지 않는 사용자입니다.";
} else if (e instanceof BadCredentialsException) {
sErrMsg = "비밀번호가 틀립니다.";
} else {
sErrMsg = "기타 인증오류입니다.";
}
...
}
|
cs |
AuthenticationFailureHandler를 구현한 핸들러에서 UsernameNotFoundException을 처리할 수 있다.
참고)
cyr9210.github.io/2019/09/30/Security/usernamenotfound/
www.programmersought.com/article/8509702354/