具有自定义会话超时的 Spring Security [关闭]
Posted
技术标签:
【中文标题】具有自定义会话超时的 Spring Security [关闭]【英文标题】:Spring Security with custom session timeout [closed] 【发布时间】:2018-01-15 18:52:48 【问题描述】:我需要一个从 GUI 设置会话超时的选项。目前我们可以使用配置全局更改会话超时
server.session.timeout=120
server.session.cookie.max-age=120
server.session.timeout=120`
我们还可以为每个会话设置会话超时。
session.setMaxInactiveInterval(120);
但找不到动态全局设置会话超时的选项。有没有办法使用spring boot来做到这一点
提前致谢
【问题讨论】:
您是否查看过示例 spring jdbc session 。 github.com/spring-projects/spring-session/blob/master/… 在那里你可以配置最大空闲超时。 是否有任何选项可以在 Spring Security 中创建自定义会话? 可能是这两者的混合:***.com/questions/5385175/…(如何设置超时)和***.com/questions/7342936/…(如何从控制器获取会话) 【参考方案1】:我认为您可能需要使用 spring jdbc session 或 redis session 以便您可以完全控制会话存储。
Spring boot jdbc session 给了一个bean
@Autowired
JdbcOperationsSessionRepository sessionRepository;
使用它我们可以从控制器设置空闲超时。
只需添加依赖项并为您的配置添加@EnableJdbcHttpSession。
http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession-jdbc-boot.html#httpsession-jdbc-boot-sample
但是看起来会话表不是自动创建的,你需要手动创建表。您可以在
中找到语句org/springframework/session/jdbc/schema-*.sql
http://docs.spring.io/spring-session/docs/current/api/org/springframework/session/jdbc/JdbcOperationsSessionRepository.html
编辑:1
即使 jdbc session 提供了一种设置全局默认超时的方法,我发现它不能正常工作。似乎唯一的解决方案是在用户首次使用以下代码登录时设置会话超时。
session.setMaxInactiveInterval(120);
【讨论】:
【参考方案2】:实现此目的的一种方法:
-
保持用户的登录时间。
以某种频率(例如 30 秒)从 GUI 向服务器发出 ajax ping 请求。
从会话中获取用户以及当 ping 请求进来时他的会话超时间隔。
将其与当前时间进行比较,如果有间隔则终止会话
超过。
以下代码使当前用户的http会话无效:
public static void customLogout(HttpServletRequest request, HttpServletResponse response)
CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
cookieClearingLogoutHandler.logout(request, response, null);
securityContextLogoutHandler.logout(request, response, null);
【讨论】:
以上是关于具有自定义会话超时的 Spring Security [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
具有会话获取在线用户的 Spring Security 返回空