【问题标题】:Is it possible to invalidate a spring security session?是否可以使弹簧安全会话无效?
【发布时间】:2012-01-18 16:12:47
【问题描述】:

我正在使用 Tomcat 6.0.32、Spring Security 3.0.5

在我的网络应用中,一些用户可以更改其他用户的权限。发生这种情况时,我想使权限已更改的用户的任何会话无效。这可能吗?如果可以,怎么办?

【问题讨论】:

    标签: spring tomcat spring-mvc spring-security


    【解决方案1】:

    您通常不能在不借助容器特定 API 的情况下立即使用户会话无效,因为访问 HttpSession 的唯一方法是通过 HttpServletRequest 对象。

    相反,您可以将用户名缓存在内存存储中,并在过滤器或自定义 AccessDecisionVoter 中进行查询。在用户表中使用标志并不是一个好主意,因为标志本质上是瞬态的(在服务器重新启动后无关紧要),最好避免对每个请求的数据库查询造成性能损失。

    这种事情有一个blog article on using custom voters。它已经过时了,但一般方法是合理的。

    另一种方法是使用 Spring Security 的SessionRegistry,它是会话管理功能的一部分。通常这用于限制用户可以拥有的会话数,但也可以用于list currently authenticated users 或标记他们的会话到期。

    也可能只是重新加载用户的权限,而不是完全注销它们。

    【讨论】:

    • 感谢您的想法和信息链接。我会试一试,然后告诉你进展如何。
    • 这仅适用于您的应用在一台服务器上运行的情况。是吗?
    • 是的,目前仅在一台服务器上。当我们移动到多台服务器时,会牢记您的观点。
    【解决方案2】:

    我相信这就是您所需要的 - 获取已登录用户的列表并使您不需要的用户的会话无效。

    http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html#list-authenticated-principals

    【讨论】:

      【解决方案3】:

      假设您在多台服务器上运行您的应用程序,您将需要有一种方法在所有服务器上实现这一点。

      1. 将时间戳字段添加到您的用户表(或等效表)中,该字段会在用户 prvis 更改时更新。

      2. 编写一个 servlet 过滤器,检查当前会话是否已通过身份验证,并且数据库中用户的时间戳是否大于会话的创建时间。如果是这样,则使会话无效并重定向到某个地方。

      这个过滤器需要在 Spring Security 过滤器之后。

      如果您没有在多个服务器上运行您的应用程序,那么您可以使用 SessionRegistry。

      【讨论】:

      • 更改为使用时间戳而不是标志。
      • 什么是用户权限?
      • 您的方案是拒绝第二次登录?首次登录时不要注销。
      【解决方案4】:

      HTTPSession 对象有一个无效方法。当用户更改某些权限时,您需要调用此方法以使它们无效并为当前会话重新加载。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2020-09-19
        • 2021-05-26
        • 2013-09-09
        • 2020-11-06
        • 2020-03-29
        • 1970-01-01
        • 2011-06-02
        相关资源
        最近更新 更多