이전 스프링 시큐리티에 이어서 이번에는 로그인 성공/실패시 핸들러를 이용하여 별도의 처리를 하게끔 방법을 알려드리겠습니다.
별도의 처리를 위해 핸들러를 등록하시고 싶은 경우에 이 글을 보고 수정하시면 될것 같습니다.
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 라고 뜨는데요
에러메세지의 내용은 다음과 같습니다.
이상으로 스프링 시큐리티의 핸들러 등록에 대해서 간단히 알아보았습니다.
'프로그래밍 > 스프링[Spring]' 카테고리의 다른 글
[jsp,jstl,java] 줄바꿈, 개행, 공백 replace 처리하기 (2) | 2019.07.10 |
---|---|
자바 날짜[Date] 비교하는 방법[스프링] (0) | 2019.07.09 |
네이버 클라우드 플랫폼 - 새로운 네이버 지도 이용하기 (0) | 2019.07.03 |
[스프링] 스프링 시큐리티 처음에만 로그인이 안 되는 현상[PreparedStatementCallback] (0) | 2019.06.27 |
[스프링] log4J 처음 사용하기[xml 이용] (0) | 2019.06.18 |