【问题标题】:Spring Security concurrent session control max-session in Cluster Environment集群环境下 Spring Security 并发会话控制 max-session
【发布时间】:2014-01-09 14:07:06
【问题描述】:

我正在使用 Spring framework 4.0 Release 版本,以及 Spring Security 3.2 Release 版本。我遇到了需要使用功能来限制同一用户 ID 的活动会话数的情况。通过阅读 Spring Security 文档,我了解到 Spring Security 提供了this 类型的功能。我试过以这种方式实现它。它工作正常(在单个系统上)。我已经使用自定义 UserDetailsS​​ervice 类和自定义 UserDetails 类。

现在出现的一个问题是,如何在集群环境中实现这种行为?我有一个具有粘性会话机制的集群环境。

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    您将需要实现自定义 SessonRegistry。您将需要一种方法(首选:数据库)在集群节点之间共享会话。

    所以当用户成功认证时.. 检查是否已经有一个 sessionId 已经分配给用户(在数据库中)。然后,使之前的 ID 无效并保存新的会话 ID。

    此外,为了验证请求,您需要使用数据库对其进行验证。

    【讨论】:

    • 是的,这可以成为在集群环境中管理并发会话的一种方式。我想到的一种方法是分布式缓存。我实际上期待 Spring 框架本身的任何支持,这样我就不需要关心每个集群上每个用户的活动会话。但听起来 Spring Security 没有提供它。我已阅读 Spring Security 3.2 Release 的参考手册。但很难获得有关集群环境中max-session 属性的信息。你知道 Spring 框架对集群环境的支持吗?
    • 这样做,根据你的说法,哪种方式会更好?有 SessionRegistry 接口的自定义实现或有 Session 监听器来处理用户会话?
    • 会话监听器?你打算怎么做。在我的一个项目中,我结合使用自定义 SessionRegistry 和 ConcurrentSessionControlStrategy 来实现这一目标
    • 目前我有两个选择。一种是使用 SessionListener。我正在开发的应用程序目前的用户数量非常有限。因此,通过从 SessionRegistryImpl 迭代所有可用会话。这不是首选的处理方式。另一种方法是实现自己的 SessionRegistry 实现。但是我对实现定制的知识知之甚少。 ConcurrentSessionControlRegistry 在我正在使用的 Spring Security 3.2 中已弃用。
    • 顺便问一下,你是如何覆盖SessionRegistry 接口的行为的?我的意思是,我试图覆盖它,但要执行它需要有SessionInformation 对象的操作。那么,有没有办法分配自定义 SessionInformation 而不是来自 Spring Security 的呢?因为我使用 JPA 将会话相关信息存储到数据库并使用 sessionId 获取数据需要具有SessionInformation 的默认参数构造函数。所以,我坚持那部分......任何提示!
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 2021-04-18
    • 2020-10-26
    • 2014-09-22
    • 2011-01-01
    • 2012-01-25
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多