我正在使用Tomcat 6.0.32,Spring Security 3.0.5
在我的网络应用中,某些用户可以更改其他用户权限。发生这种情况时,我想为其权限已更改的用户的任何会话无效。这是可能的,如果是这样的话?
答案 0 :(得分:12)
您通常无法在不使用特定于容器的API的情况下更改其帐户信息时立即使用户会话无效,因为访问HttpSession
的唯一方法是通过HttpServletRequest
对象
相反,您可以将用户名缓存在内存存储中,并在过滤器或自定义AccessDecisionVoter
中查阅。在用户表中使用标志并不是一个好主意,因为标志本质上是暂时的(在服务器重启后它是无关紧要的)并且最好避免每次请求时数据库查询的性能损失。
这种事情有blog article on using custom voters。它已经过时了,但一般方法都是合理的。
另一种方法是使用Spring Security的SessionRegistry
,它是会话管理功能的一部分。通常,这用于限制用户可以拥有的会话数,但也可以用于list currently authenticated users或标记其会话到期。
重新加载用户的权限也许是一个想法,而不是完全记录它们。
答案 1 :(得分:6)
我相信这就是您所需要的 - 获取已登录用户的列表并使您不需要的会话无效。
答案 2 :(得分:2)
假设您在多台服务器上运行您的应用程序,您将需要有办法在所有服务器上实现此目的。
将时间戳字段添加到更改用户prvis时更新的用户表(或等效字段)。
编写一个servlet过滤器,用于检查当前会话是否经过身份验证,以及DB中用户的时间戳是否大于会话的创建时间。如果这样使会话无效并重定向到某个地方。
此过滤器需要在Spring Security过滤器之后。
如果您没有在多台服务器上运行您的应用程序,那么您可以使用SessionRegistry。
答案 3 :(得分:0)
HTTPSession对象具有invalidate方法。当用户更改某些权限时,您需要调用此方法使其无效并为当前会话重新加载它们。