是否可以使spring安全会话无效?

时间:2011-12-12 17:20:30

标签: spring tomcat spring-mvc spring-security

我正在使用Tomcat 6.0.32,Spring Security 3.0.5

在我的网络应用中,某些用户可以更改其他用户权限。发生这种情况时,我想为其权限已更改的用户的任何会话无效。这是可能的,如果是这样的话?

4 个答案:

答案 0 :(得分:12)

您通常无法在不使用特定于容器的API的情况下更改其帐户信息时立即使用户会话无效,因为访问HttpSession的唯一方法是通过HttpServletRequest对象

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

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

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

重新加载用户的权限也许是一个想法,而不是完全记录它们。

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

假设您在多台服务器上运行您的应用程序,您将需要有办法在所有服务器上实现此目的。

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

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

  3. 此过滤器需要在Spring Security过滤器之后。

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

答案 3 :(得分:0)

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