Spring Boot/Spring Security

[Spring Security] Form Login 인증

수수한개발자 2022. 6. 29.
728x90

SecurityCong

 http
               .authorizeRequests()
                .anyRequest().authenticated();//모든 곳에 인증해야함
        http
                .formLogin()
                .loginPage("/loginPage")        //로그인커스텀 페이지 기본은 security가 제공하는 /login으로 이동한다.
                .defaultSuccessUrl("/")          //성공했을때의 이동 페이지
                .failureUrl("/login")  //실패시 돌아갈 URL
                .usernameParameter("userId")
                .passwordParameter("passwd")
                .loginProcessingUrl("/login_proc")  //로그인읋 할때 전송되는 URL
                .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("/");
                    }
                })
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                        System.out.println("exception: " + exception.getMessage());
                        response.sendRedirect("loginPage");
                    }
                })
                .permitAll()//위에는 모든사람이 접근 허용
        ;

configure 메서드에 위와 같이 설정해줍니다. 각 메서드의 정보는 주석으로 적어놨습니다.

그리고 서버를 기동해 / 경로로 들어가줍니다.

만약에 인증을 해야 된다면 loginPage("loginPage")를 controller에 만들어줬기 때문에 

@GetMapping("/loginPage")
public String loginPage() {
    return "loginPage";
}

위와 같이 이동되어 문자가 출력이 됩니다.

잘 작동하는 것을 확인되었습니다. 이것으로 나중에 커스텀 로그인 페이지를 만들 수 있습니다.

하지만 저희는 밑의 성공 핸들러와, 실패 핸들러를 확인해야 되기 때문에  잠시 주석처리를 해줍니다.

 

그리고 

System.out.println("Authentication: " + authentication.getName());
 System.out.println("exception: " + exception.getMessage());

여기에 브레이크 포인트를 걸고 디버그 모드로 서버를 다시 켜줍니다.

user아이디와 비밀번호를 1111 쳐주면 인증이 성공되어서 successHandler를 호출하게 됩니다.

 

아이디와 비밀번호를 설정한 것과 동일하게 입력하면 successHandler의 브레이크 포인트가 걸려 잘 authentication객체가 잘 들어와 있는 것을 알 수 있습니다.

잘못 쳤을 경우에는 failureHandelr로 가겠죠? 이렇게 성공, 실패 핸들러 검증을 완료했습니다.

 

그리고 

    . usernameParameter("userId")
    . passwordParameter("passwd") 

를 디폴트 값이 아니라 이렇게 설정해주면 로그인 화면에서 

name 값이 자동으로 설정되는 것을 알 수 있습니다. 이렇게 해서 인증처리를 할 때 파라미터를 본인이 구현하는 프로젝트에서 pk값이나 인증할 수 있는 값으로 바꿔서 사용할 수 있습니다.

728x90

댓글