【发布时间】:2012-04-30 13:57:11
【问题描述】:
Shiro 似乎在 Web 应用程序中缓存了身份验证信息。当我在会话期间尝试将用户锁定在数据库中时(设置锁定 = true),他继续工作并且没有调用身份验证代码 (doGetAuthenticationInfo)。锁定仅在用户注销并尝试再次登录时应用。
奇怪的是,Shiro 的缓存默认应该是禁用的。
如何在他的活动期间锁定用户而不是等待他在 Shiro 中注销?也许我错过了一些概念?
【问题讨论】:
Shiro 似乎在 Web 应用程序中缓存了身份验证信息。当我在会话期间尝试将用户锁定在数据库中时(设置锁定 = true),他继续工作并且没有调用身份验证代码 (doGetAuthenticationInfo)。锁定仅在用户注销并尝试再次登录时应用。
奇怪的是,Shiro 的缓存默认应该是禁用的。
如何在他的活动期间锁定用户而不是等待他在 Shiro 中注销?也许我错过了一些概念?
【问题讨论】:
你只是修改数据库吗?我猜想这是 shiro 保持会话并因此“缓存”这个值的预期行为。
如果您想立即销毁用户会话,请执行
//removes all identifying information and invalidates their session too.
currentUser.logout();
【讨论】:
我还没有找到很好的解决方案,但我确实找到了解决方案。虽然这个问题可能太老了,无法帮助原始发帖者,但它可能会帮助其他有相同问题的人。
我已经有一个扩展 FormAuthenticationFilter 的自定义权限过滤器,我所有来自客户端的非 ajax 请求都通过这个过滤器。所以,我添加了一个检查来查看用户帐户是否被锁定在isAccessAllowed(...)。如果它被锁定,那么我将用户注销并让过滤器继续。它会将他们发送到登录页面。
这有一个主要缺点:它本质上是用户驱动的数据库轮询,以查看帐户是否被锁定。
如果锁定帐户的过程能够从用户的会话中获取正确的主题并将该会话注销,那就更好了。我可以获得用户的会话,但这似乎没有帮助,因为我无法获得正确的主题对象。更改会话似乎没有帮助。
对于它的价值,Jared Bunting 提出了另一个好主意,不幸的是对我没有用。他的建议是检查何时获得权限和角色,并且不授予某人对锁定帐户的权限。这对我不起作用,因为我只使用身份验证来让用户获得一些访问权限(不需要其他权限)。
【讨论】: