Spring Security:在覆盖会话之前显示警告

Posted

技术标签:

【中文标题】Spring Security:在覆盖会话之前显示警告【英文标题】:Spring Security: Show warning before overwriting session 【发布时间】:2017-05-07 15:05:39 【问题描述】:

我已将最大并发会话数设置为 1。 现在有 2 situations 如果有活动会话(有人已经为该用户 ID 登录)我想处理:

    如果用户在同一浏览器上再次访问登录页面: 在这种情况下,他将直接登录。

    如果用户从不同的浏览器/客户端机器登录:在这种情况下,需要显示错误“此用户的会话已处于活动状态。您确定要覆盖会话吗?”。如果用户选择'yes',错误将显示在上一个会话中(这个我知道错误页面可以配置),如果他选择'no',则不会登录,上一个会话将继续。

如何使用 Spring Security 实现这些用例?到目前为止,我已经能够通过设置最大会话数和错误页面找到并发会话的基本管理。

请帮忙。

谢谢。

【问题讨论】:

【参考方案1】:

我想你几乎做到了。要在覆盖会话之前询问用户,请按照以下步骤操作。

    ConcurrentSessionFilter 的 expiredUrl 属性应该到达提供 UI 以询问用户的页面(例如 askUser.html)。 askUser.html 表单使用 POST 参数 yes 或 no 提交到另一个 url(例如 /api/confirmSessionRewrite)。

    在控制器 ConfirmSessionRewrite 中,要么从会话注册表中删除用户,要么将其转发到登录页面。

    sessionRegistry.removeSessionInformation(info.getSessionId());

    您必须修改配置,以便 ConcurrentSessionFilter 不会在 /api/confirmSessionRewrite 请求上运行。否则将是一个循环。

【讨论】:

以上是关于Spring Security:在覆盖会话之前显示警告的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security OAuth2 不会终止会话并再次显示登录

Spring Boot,Spring Security,会话范围 Bean 的会话超时问题,@PreDestroy

Spring Security 中是不是存在会话超时异常?

没有 cookie 的 Spring Security 会话

SAML Spring Security 会话超时

Grails Spring Security - 会话超时后重新登录时重新加载会话变量