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