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