관리 메뉴

ふたりで

springboot+security session timeout config 본문

Spring

springboot+security session timeout config

graykang 2022. 6. 23. 11:22
728x90
반응형
SMALL

WAS 서버의 timeout 설정 외에 war별? 애플리케이션에 별도 session timeout 설정이

필요한 경우...

 

1. 스프링 씨큐리티 설정 파일에 로그인 성공 시 후처리용 헨들러를 설정한다.

public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

    /**로그인성공 후처리용 헨들러
    * @return
    */
    private SuccessHandlerImpl successHandler() {
        return new SuccessHandlerImpl();
    }

...생략...

	@Override
    protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
...생략...
        	.successHandler(successHandler())//필터로등록
...생략...

}

 

 

SMALL
반응형
728x90

2. 로그인성공 후처리용 헨들러 

package com.graykang.test.config.security;

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;

import com.graykang.test.common.model.CustomUserDetailsImpl;

/**
 * @author graykang
 *
 */
public class SuccessHandlerImpl implements AuthenticationSuccessHandler{
	//시간 참조 설정.
	public final Integer SESSION_TIMEOUT_IN_SECONDS = 60 * 300;//30m
    
	@SuppressWarnings("unchecked")
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {
		
		CustomUserDetailsImpl cusd= (CustomUserDetailsImpl) authentication.getPrincipal();
		
		Collection<GrantedAuthority> authlist = (Collection<GrantedAuthority>) cusd.getAuthorities();
		Iterator<GrantedAuthority> authlist_it = authlist.iterator();
		String url = request.getContextPath()+"/front/dashBoard";
		
		while(authlist_it.hasNext()) {
			GrantedAuthority authority = authlist_it.next();
			System.out.println("SuccessHandler:"+authority.getAuthority());
			if(authority.getAuthority().equals("ROLE_ADMIN")) {
				request.getSession().setAttribute("msg", "ADMIN");
                		//세션에 MaxInactiveInterval 설정으로 세션타임아웃 설정.
				request.getSession().setMaxInactiveInterval(SESSION_TIMEOUT_IN_SECONDS);
				url = request.getContextPath()+"/admin/adminmain";
			}else{
				request.getSession().setMaxInactiveInterval(SESSION_TIMEOUT_IN_SECONDS);
				request.setAttribute("msg", "USER");
			}
		}
		
		response.sendRedirect(url);
	}

}

음... 테스트 결과 security의 인증 과정을 거쳐야만 타임아웃이 먹히는 것 같다. 정상적인 로그인 이외에 별도로 강제로

세션을 생성해주는 경우 타임아웃이 먹히지 않는다. 해서 아래와 같이 HttpSessionListener를 사용하는 방법으로

처리를 하니 비정상(수동임의 세션) 세션생성을 했을 경우도 타임아웃이 잘 걸린다.

package com.graykang.test.config.security;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
class SessionListener implements HttpSessionListener {

    //application.properties에 session.timeout=1800 으로 설정.
    @Value("${session.timeout}")
    private Integer sessionTimeout;

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        event.getSession().setMaxInactiveInterval(sessionTimeout);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {}

}

 

728x90
반응형
LIST
Comments