【发布时间】:2012-01-18 16:12:47
【问题描述】:
我正在使用 Tomcat 6.0.32、Spring Security 3.0.5
在我的网络应用中,一些用户可以更改其他用户的权限。发生这种情况时,我想使权限已更改的用户的任何会话无效。这可能吗?如果可以,怎么办?
【问题讨论】:
标签: spring tomcat spring-mvc spring-security
我正在使用 Tomcat 6.0.32、Spring Security 3.0.5
在我的网络应用中,一些用户可以更改其他用户的权限。发生这种情况时,我想使权限已更改的用户的任何会话无效。这可能吗?如果可以,怎么办?
【问题讨论】:
标签: spring tomcat spring-mvc spring-security
您通常不能在不借助容器特定 API 的情况下立即使用户会话无效,因为访问 HttpSession 的唯一方法是通过 HttpServletRequest 对象。
相反,您可以将用户名缓存在内存存储中,并在过滤器或自定义 AccessDecisionVoter 中进行查询。在用户表中使用标志并不是一个好主意,因为标志本质上是瞬态的(在服务器重新启动后无关紧要),最好避免对每个请求的数据库查询造成性能损失。
这种事情有一个blog article on using custom voters。它已经过时了,但一般方法是合理的。
另一种方法是使用 Spring Security 的SessionRegistry,它是会话管理功能的一部分。通常这用于限制用户可以拥有的会话数,但也可以用于list currently authenticated users 或标记他们的会话到期。
也可能只是重新加载用户的权限,而不是完全注销它们。
【讨论】:
我相信这就是您所需要的 - 获取已登录用户的列表并使您不需要的用户的会话无效。
【讨论】:
假设您在多台服务器上运行您的应用程序,您将需要有一种方法在所有服务器上实现这一点。
将时间戳字段添加到您的用户表(或等效表)中,该字段会在用户 prvis 更改时更新。
编写一个 servlet 过滤器,检查当前会话是否已通过身份验证,并且数据库中用户的时间戳是否大于会话的创建时间。如果是这样,则使会话无效并重定向到某个地方。
这个过滤器需要在 Spring Security 过滤器之后。
如果您没有在多个服务器上运行您的应用程序,那么您可以使用 SessionRegistry。
【讨论】:
HTTPSession 对象有一个无效方法。当用户更改某些权限时,您需要调用此方法以使它们无效并为当前会话重新加载。
【讨论】: