본문 바로가기

프로그래밍/스프링[Spring]

[스프링] 스프링 시큐리티 핸들러 생성하기[로그인 성공/실패 처리]



이전 스프링 시큐리티에 이어서 이번에는 로그인 성공/실패시 핸들러를 이용하여 별도의 처리를 하게끔 방법을 알려드리겠습니다.

 

 

별도의 처리를 위해 핸들러를 등록하시고 싶은 경우에 이 글을 보고 수정하시면 될것 같습니다.

 

XML 설정에 핸들러 등록

http태그의 form-login 설정에 다음과 같은 코드를 추가합니다.

 

<http>
  <form-login
    authentication-success-handler-ref="customAuthenticationSuccessHandler"
    authentication-failure-handler-ref="customAuthenticationFailureHandler"
  >
<http>

 

그리고 해당 bean을 등록합니다.

 

<beans:beans
  <http>
   ....
    <!-- 성공 핸들러 등록 -->
    <beans:bean id="customAuthenticationSuccessHandler" class="com.common.security.AuthenticationSuccessHandler">
        <beans:property name="defaultTargetUrl" value="/main.do" /> 
        <beans:property name="alwaysUseDefaultTargetUrl" value="true" /> 
    </beans:bean> 
    <!-- 실패 핸들러 등록 -->
    <beans:bean id="customAuthenticationFailureHandler" class="com.common.security.AuthenticationFailureHandler">
        <beans:property name="loginId" value="id"/>
        <beans:property name="loginPwd" value="pwd"/>
        <beans:property name="errorMsg" value="ERRORMSG"/>
        <beans:property name="defaultFailureUrl" value="/login/loginFail.do" /> 
    </beans:bean>
</beans:beans>

 

 

이 부분은 로그인 성공이 이동할 URl 을 입력합니다

 

그럼 로그인 판별 -> 핸들러 이동 -> 해당 URL 의 순서로 작동하게 됩니다.

 

<!-- 성공 핸들러 내용--> <beans:property name="defaultTargetUrl" value="/main.do" />

 

 

자 다음으로는 실패할때 실행되는 핸들러입니다.

 

<!-- 실패 핸들러 내용-->
<beans:property name="loginId" value="id"/>
<beans:property name="loginPwd" value="pwd"/>
<beans:property name="errorMsg" value="ERRORMSG"/>
<beans:property name="defaultFailureUrl" value="/login/loginFail.do" /> 

 

다음과 같이 프로퍼티를 설정하여 Id, Pwd, 에러메세지, 실패시 이동할 URL 을 설정합니다.

 

일단 authenticationSuccessHandler 부터 등록하겠습니다.

 

본인이 원하는 경로에 생성하고 class 부분에 경로만 맞춰 주시면 됩니다.

 

 <beans:bean id="customAuthenticationSuccessHandler" class="com.common.security.AuthenticationSuccessHandler">

 

 

자 다음으로는 AuthenticationSuccessHandler의 소스코드입니다.

 

@Configuration
public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
  //로그인 성공시 필요한 작업 추가
    Logger logger = Logger.getLogger(this.getClass());
    
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {

        
        logger.debug("시큐리티 로그인");
        super.onAuthenticationSuccess(request, response, authentication);
    }
}

 

위와 같이 작성하고 logger로 간단히 확인해보도록 하겠습니다.

 

로그인이 성공하게 되면 다음과 같이 핸들러를 실행합니다.

 

 

실행 이후에는 해당 URL로 이동합니다.

 

다음으로는 실패 핸들러를 등록하겠습니다.

 

@Configuration
public class AuthenticationFailureHandler implements org.springframework.security.web.authentication.AuthenticationFailureHandler  {
    Logger logger = Logger.getLogger(this.getClass());
    
    private String loginId;
    private String loginPwd;
    private String errorMsg;
    private String defaultFailureUrl;

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
            throws IOException, ServletException {
        String userId = request.getParameter(loginId);
        String password = request.getParameter(loginPwd);
        String str_errorMsg = exception.getMessage();
        
        request.setAttribute(loginId, userId);
        request.setAttribute(loginPwd, password);
        request.setAttribute(errorMsg, str_errorMsg);
        
        logger.debug("id: "+ userId);
        logger.debug("pwd: "+ password);
        logger.debug("errorMsg: "+ str_errorMsg);
        logger.debug("defaultFailureUrl: "+ defaultFailureUrl);
 
        response.sendRedirect(request.getContextPath()+"/login/loginFail.do");
    }

    public String getLoginId() {
        return loginId;
    }
 
    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }
 
    public String getLoginPwd() {
        return loginPwd;
    }
 
    public void setLoginPwd(String loginPwd) {
        this.loginPwd = loginPwd;
    }
 
    public String getErrorMsg() {
        return errorMsg;
    }
 
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
 
    public String getDefaultFailureUrl() {
        return defaultFailureUrl;
    }
 
    public void setDefaultFailureUrl(String defaultFailureUrl) {
        this.defaultFailureUrl = defaultFailureUrl;
    }
}

 

실패 핸들러에서는 프로퍼티에 맞게 setter를 작성하였습니다.

 

그럼 로그인 실패시 logger에 다음과 같이 남기고 URL을 이동하게 됩니다.

 

 

 

자 여기서 에러메세지를 보면 Bad credentials 라고 뜨는데요

 

에러메세지의 내용은 다음과 같습니다.

이상으로 스프링 시큐리티의 핸들러 등록에 대해서 간단히 알아보았습니다.