보안/Spring Security

로그인 성공 했을 경우 처리할 일 - AuthenticationSuccessHandler

무적강사 2019. 9. 15. 19:17

로그인을 하는 사용자 그룹이 많이 나누어져 있거나 로그인을 성공했을 때 처리하고 싶은 일이 있을 수 있겠죠? 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"로 접속됩니다.