Spring 具有自定义会话超时的安全性

Spring Security with custom session timeout

我需要一个选项来从 GUI 设置会话超时。目前我们可以使用配置全局更改会话超时

server.session.timeout=120
server.session.cookie.max-age=120
server.session.timeout=120`

我们还可以为每个会话设置会话超时。

session.setMaxInactiveInterval(120);

但是没有找到全局设置会话超时的选项。有什么方法可以使用 spring boot

提前致谢

我认为您可能需要使用 spring jdbc session 或 redis session 以便您可以完全控制 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.setMaxInactiveInterval(120);

实现此目的的一种方法:

  1. 保留用户的登录时间。
  2. 从 GUI 向服务器发出 ajax ping 请求,频率为 30 秒。
  3. 在 ping 请求进来时从会话中获取用户及其会话超时间隔。
  4. 将它与当前时间进行比较,如果有间隔,则终止他的会话 超过。

Below code invalidates http session of the current user:

    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);

    }