로그인 성공 했을 경우 처리할 일 - AuthenticationSuccessHandler
로그인을 하는 사용자 그룹이 많이 나누어져 있거나 로그인을 성공했을 때 처리하고 싶은 일이 있을 수 있겠죠? spring security로 작업을 하는 것이다 보니 세션에서 꺼내거나 이런 작업을 하지 않습니다.
따라서 로그인에 성공했을 때 실행되는 객체가 무엇인지 알아야 할텐데요. spring security에서 제공하는 클래스는 굉장히 직관적이고 알아보기 쉬운 클래스를 제공합니다. 바로 AuthenticationSuccessHandler입니다. 이 클래스를 커스트마이징 하고 등록하면 바로 실행될 것입니다.
우선 ktds.erp.emp.authentication패키지에 AuthenticationSuccessHandler를 상속하는
LoginSuccessHandler를 작성합니다.
onAuthenticationSuccess메소드를 오버 라이딩하고 성공했을 때 처리하고 싶은 기능을 이 메서드 안에 정의하면 됩니다. 매개변수로 HttpServletRequest와 HttpServletResponse, 그리고 Authentication객체가 정의되어 있습니다.
getPrincipal() 메서드를 이용하여 인증된 사용자의 정보 즉, dto를 리턴 받아 사용할 수 있습니다.
SecurityLoginDTO dto = (SecurityLoginDTO)authdata.getPrincipal();
아래 예제에서 기본은 로그인이 성공한 후 "/index.do"로 이동하고 "admin"권한이나 "sysadmin"권한을 가지고 있는 사용자가 접속하면 "/kimsaemERP/admin/index.do"로 접속할 수 있도록 하고 있습니다.
package ktds.erp.emp.authentication;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
public class LoginSuccessHandler implements AuthenticationSuccessHandler{
@Override
public void onAuthenticationSuccess(HttpServletRequest req,HttpServletResponse res,
Authentication authdata)
throws IOException, ServletException {
//인증된 사용자의 정보를 추출
SecurityLoginDTO dto =
(SecurityLoginDTO)authdata.getPrincipal();
System.out.println("인증후=>"+dto);
//권한리스트를 추출
Collection<GrantedAuthority> authlist = dto.getAuthorities();
Iterator<GrantedAuthority> authlist_it= authlist.iterator();
String url="/kimsaemERP/index.do";
while(authlist_it.hasNext()) {
GrantedAuthority authority= authlist_it.next();
//설정되어 있는 권한 중 ROLE_ADMIN이 있다면
if(authority.getAuthority().equals("admin") |
authority.getAuthority().equals("systemadmin")) {
url="/kimsaemERP/admin/index.do";
}
}
req.getSession().setAttribute("msg", "관리자페이지입니다.");
res.sendRedirect(url);
}
}
설정 파일에 위의 작성한 클래스를 등록해야 합니다. security-config_ver7.xml로 rename 하고 web.xml을 수정합니다.
spring security설정 파일에 LoginSuccessHandler빈으로 등록하고 "authentication-success-handler-ref"속성에 등록한 LoginSuccessHandler의 아이디를 연결합니다.
<security:form-login username-parameter="id"
password-parameter="pass" login-page="/emp/login" default-target-url="/index.do"
authentication-failure-url="/emp/login.do?fail=true"
authentication-success-handler-ref="successHandler"/>
<bean id="sucessHandler" class="ktds.erp.emp.authentication.LoginSuccessHandler"/>
일반 사용자 계정으로 접속하면 "/index.do"가 실행됩니다.
관리자 권한을 갖고 있는 사용자 아이디로 접속하면 "/admin/index.do"로 접속됩니다.