Spring/Security

[Security] Form Login 인증

석석's 2021. 11. 4. 22:59

인증 시나리오 순서
 1. 인증이 안된 사용자가 특정 url로 접근
 2. 서버에서는 인증이 안된유저로 판단될 경우 로그인 페이지로 리다이렉트 시킴
 3. 사용자가 로그인 시도
 4. 인증이 되었으면 세션을 생성하고  그 세션안에  인증토큰(Authentication 타입의 클래스 객체  , Security Context)을 생성 시킨후 저장함
 5. 사용자는 다시한번 특정 url 접근시 세션안에 저장되어 있는 인증 토큰으로 리소스 에 접근하고 스프링 시큐리티는 세션에 저장된 인증토큰 을 보고 인증을 유지함  


 인증 API 에 대해 살펴보기  
  - Form Login 인증 
    http.formLogin()  // form로그인 인증 기능이 작동함
     .loginPage("/login.html")   // 로그인 페이지 설정하기 (기본적으로는 시큐리티가 제공하는 로그인 페이지가 있지만 내가 직접 만들어서 사용할경우 !!! , 사실 필수 일듯)
     .defaultSuccessUrl("/home") //로그인 성공시 이동할 페이지 
     .failureUrl("/login.html?error=true")//로그인 실패 시 이동할 페이지 
     .usernameParameter("userId")//로그인 페이지 html 안에 태그중 username에 해당하는 태그에 name 옵션을 바꾸고 싶을때 (로그인시 백단에서 받을 파라미터명이다.  , default 값은 username)
     .passwordParameter("passwd")//로그인 페이지 html 안에 태그중 password에 해당하는 태그에 name 옵션을 바꾸고 싶을때 (로그인시 백단에서 받을 파라미터명이다.  , default 값은 password)
     .loginProcessingUrl("/login") //로그인 페이지 html 안에 form 태그의 action 부분에 해당하는 것 
     .successHandler(loginSuccessHandler())//로그인 성공 후 핸드러로 조작 하고 싶을때
     .failureHandler(loginSuccessHandler())// 로그인 실패 후 핸드러로 조작 하고 싶을때

 

 


한번 시나리오와 API를 이용하여 구현을 해볼것이다.

 

먼저 "configure 메소드 안에 http.formLogin() 메소드를 사용하여 Form 로그인 방식이 동작하도록 설정 하여야 한다

그 후 설정 메소드들을 모두 필요한 만큼 쓰면된다.

 

 

 http.formLogin() //form 로그인방식 제공
     .loginPage("/loginPage")
     .defaultSuccessUrl("/")
     .failureUrl("/login")
     .usernameParameter("userId")
     .passwordParameter("passwd")
     .loginProcessingUrl("login_proc")
     
     //원래는 AuthenticationSuccessHandler를 상속받은 커스텀 클래스를 만들어넣어야하는데 간단히 하기 위해 익명객체로 했음
     .successHandler(new AuthenticationSuccessHandler() { 
     @Override
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
       //authentication 은 최종적으로 인증결과를 담은 객체임
         System.out.println("authentication " + authentication.getName());
         response.sendRedirect("/");
       }
     })
     //원래는 AuthenticationFailureHandler를 상속받은 커스텀 클래스를 만들어넣어야하는데 간단히 하기 위해 익명객체로 했음
     .failureHandler(new AuthenticationFailureHandler() { 
     @Override
     public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
         System.out.println("exception" + e.getMessage());
         response.sendRedirect("/login");
       }
     })
     .permitAll()//인가정책에서 모든 접근에 대해 인증을 받도록 했는데 로그인 페이지는 그러면 안되니깐 로그인 페이지만 인증없이 접근 가능하도록 설정함

 

 

설정한것에 결과를 몇개만 보면 

usernameParameter , passwordParameter 설정으로 인해 사진과 같이 "name" 태그가 변경된 것을 확인 할 수있다.

 

 

 

로그인 성공시 동작하는 successHandler

 

 

 

로그인 실패시 동작하는 failureHandler