Form 로그인 인증필터가 인증성공후에 핸들러를 호출해서 후속작업들을 처리 하는 과정을 하고자 한다
AuthenticationSuccessHandler 인터페이스를 구현해서 클래스를 만들수가 있고 SpringSecurity에서 이미
만들어진 구현체가 있는데 그 구현체를 상속해서 AuthenticationSuccessHandler타입의 클래스를 만들어서
인증 AP에 설정할수 있다.
SpringSecurity 에서 만들어진 구현체를 상속받아서 진행 하겠다. 기본 구현체중에서 SimpleAuthenticationSuccessHandler를 상속해서
호출할수 있도록 구현해보겠다.
onAuthenticationSuccess @Override를 해서 여러가지 후속 작업들을 처리 할수 있다.
파라미터로 request,reponse,authentication 3가지 객체로 여러가지 후속 처리들을 할수 있다.
여기서 RequestCache 라는 객체를 사용해서 실제로 사용자가 인증에 성공한후에 이동할 페이지를 설정해주고 만약에 인증에 성공하지 못할경우에는 로그인 페이지로 이동하게끔 한다. 또한, 로그인 페이지에서 성공한 후에 가고자 했던 서버자원에 접근 할수 있도록 설정해주고자 한다.
여기서 잠깐만 언급을 하자면 이클래스 에서 authentication은 인증을 시도하는 객체가아니다 SpringSecurity는 인증에 성공한 후 에도 새로운 Authentication을 만든다. 기본적으로 사용자가 인증을 할때 authentiation을 생성하는데 그때 기본적으로 사용자가 전달하는 username,password를 받아서 인증을 시도한다 이후에 SpingSecurity 는 인증에 성공하면 사용자가 가지고 있는 권한정보와 인증결과를 새로 저장해야 하는데 그때 다시 Authentiocation을 생성한다 그이후에 ContextHolder에 저장되고 개발자는 인증정책에 따라 authentication 을 참조해서 구현 할수 있다. 그리고 인증과정에서 SpringSecurity는 사용자가 요청한 정보에 따라 인증을 하기 위해 14개의 필터 체인을 호출하고 14개의 필터에서 검수가 끝나면 인증결과 객체를 새로 생성한다 만약 인증에 성공하지 못하면 예외가 발생되고 개발자가 설정해 놓은 페이지로 이동하게끔 되어 있다. 헛~ 너무 딴길로 와버린거 같다 ㅋㅋ
RequestCache 사용해서 이전에 사용자가 요청에 관련된 정보들을 담고 있는 session을 가져와서 참조를 할거고
최종적으로 이동할수 있도록 RedirectStrategy객체를 생성해준다
사용자가 인증에 성공하기전에 요청한 정보들을 불러와서 저정해줄필요가 있다.
SavedRequest savedRequest = requestCache.getRequest(request,response)
if ( savedRequest!=null ){
String targetUrl = savedRequest.getRedirectUrl();
redirectStrategy.sendRedirect(request,response,targetUrl);
} else {
redirectStrategy.sendRedirect(request,response,getDefaultTargetUrl());
savedRequest 널일수도 있다. 사용자가 자원애 접근권한이 없어서 예외가 발생해 다시 로그인 페이지로 이동하게 된다거나 이전에 정보가 없는 경우에는 null 일수도 있다. 그렇기 때문에 null 체크를 해줘야한다. null일 경우에는 setDefaultTargetUrl("/") 로 기본적으로 이동할수 있는 페이지를 따로 설정해줘야 한다.
successHandler api 를 사용해서 방금 만들었던 클래스를 사용할수 있다. 디버깅을 통해 후속처리 과정을 한번 보자
현재 필자는 로그인을 하게되면 null이다 현재 바로 로그인을 버튼을 클릭해서 인증을 시도 하고 있기 때문에 어떤한 요청도 하지 않았다 다만 로그인 인증요청만 했을뿐이다 그래서 null값이 확인된다 . 자 그러면 다시 로그아웃을 하고 마이페이지를 접근 해보자
이전에 마이피이지 접근권한은 ROEL_USER 만이 접근이 가능하다고 했다. 그리고 권한이 없을 경우 사용자는 로그인 페이지로 이동하게끔 설정이 되어 있다. 그래서 다시 로그인 인증을 시도해야 한다.
현재는 마이페이지 클릭이후에 로그인 페이지로 돌아갔고 다시 인증을 시도하는 중이다.아까와 다르게null이 아니고 사용자가 접근하고자 했던 서버자원URL이 확인된다. 이후에는 바로 마이페이지에 접근이 가능하다.
'SpringSecurity' 카테고리의 다른 글
SpringSecurity(AccessDenied) 인증거부처리 (0) | 2020.12.09 |
---|---|
SpringSecurity(인증실패핸들러) (0) | 2020.12.07 |
SpringSecurity(Authentication) 인증 부가기능 (0) | 2020.12.02 |
SpringSecurity(로그아웃 및 인증에 따른 화면 보안처리) (0) | 2020.11.25 |
SpringSecurity( 커스텀 로그인 페이지 생성하기) (0) | 2020.11.25 |