SpringSecurity 에서 기본적으로 제공하는 AuthenticationFaulureHandler 인터페이스를 구현 해도 된다 필자는 SpringSecurity 에서 제공하는 SimpleUrlAuthenticationFailureHandler 를 상속받아서 처리해보고자 한다.
#onAuthenticationFailure 메소드를 @Override를 한다 파라미터 값들을 보면 AuthenticationException 인증예외를
전달하고 있다.
여기 인증예외는 인증을 검증할때 인증에 실패하게되면 예외를 발생하게되는데 일반적으로 Provier UserDetails 에서
사용자의 아이디가 없거나 패스워드 검증이 실패하면 인증필터가 받아서 Failur 핸들러를 호출해서 실패처리를 하게된다.
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException,
ServletException {
#기본적으로 전달하는 예외메세지를 작성
String errorMessage = "Invalid Username or Password";
#예외 종류? 타입 별로 나눠서 메세지를 전달할수 있다.
if(exception instanceof BadCredentialsException ){
errorMessage ="Invalid Username or Password";
#시크릿 키가 일치하지 않을 경우에
} else if(exception instanceof InsufficientAuthenticationException ){
errorMessage = "Invalid Secret key";
}
#기본적으로 로그인페이지로 이동하는데 에러 파라미터를 전달하도록한다
setDefaultFailureUrl("/login?error=true&exception=" + exception.getMessage());
#최종적으로 응답을 하기위해서 onAuthenticationFailure에게 처리를 위임한다.
super.onAuthenticationFailure(request, response, exception);
#exception 메시지를 담아서 사용자에게 전달하기 위해 Model객체를 이용해서 사용자에게 전달한다.
@GetMapping("/login")
public String login(@RequestParam(value = "error",required = false)String error,
@RequestParam(value = "exception",required = false)String exception, Model model){
model.addAttribute("error",error);
model.addAttribute("exception",exception);
return"user/login/login";
}
#파라미터 값으로 에러가 전달되면 예외메세지를 전달할수 있도록 설정한다
<div th:if="${param.error}" class="form-group">
<span th:text="${exception}" class="alert alert-danger">잘못된 아이디나 암호입니다</span>
</div>
설정클래스에서 failureHandler를 호출해서 아까 만들어줬던 authenticationFailureHandler를 호출한다.
그리고 antMatchers에서 "/login*" 추가해줘야한다 왜냐면 위에서 설정할때 error 메세제지를 파라미터값으로 보내줘야 되기 때문에 접근이 가능하도록 설정클래스에서도 설정을 해줘야한다. 그래야지 permitAll()로 인식하고 접근이 가능 하도록한다.
그리고 주의해야할점은 url 적어줄때 콤마 주의 하자. ㅜㅜ 오류 나서 잠깐 삽질하다가 돌아옴
디버깅을 통해서 과정을 살펴보자
현재 필자는 일부러 패스워드 틀리게 입력했다 .
현재는 Password 가 일치하지 않아서 생기는 오류인걸 확인할수 있다 CustomAuthenticationProvider 클래스에서 확인가능하다 이ㅡㄹ래스는 AuthenticationProvider 인터페이스를 구현한 클래스이다.
여기서 아까 만들어준 failurHandler 를 호출한다
여기서 BadCredentialsException이 발생하게되고 설정해준 에러메세지를 사용자에게 전달하게된다.
그리고 몇가지 더 확인을 해보면 DB 에 저장된 사용자의 정보를 가져와서 현재 사용자가 전달한 값들이랑 비교해보고 검증하는 과정까지 확인할수 있다 !!
'SpringSecurity' 카테고리의 다른 글
SpringSecurity(Ajax AuthenticationFilter) (0) | 2020.12.12 |
---|---|
SpringSecurity(AccessDenied) 인증거부처리 (0) | 2020.12.09 |
SpringSecurity(인증 성공 핸들러) (0) | 2020.12.04 |
SpringSecurity(Authentication) 인증 부가기능 (0) | 2020.12.02 |
SpringSecurity(로그아웃 및 인증에 따른 화면 보안처리) (0) | 2020.11.25 |