1

Shiro 似乎在 Web 应用程序中缓存了身份验证信息。当我在会话期间尝试将用户锁定在数据库中时(设置锁定 = true),他继续工作并且没有调用身份验证代码(doGetAuthenticationInfo)。仅当用户注销并尝试再次登录时才应用锁定。

奇怪的是 Shiro 的缓存默认应该被禁用。

我怎么能在他的活动期间锁定用户而不是等待他在 Shiro 中注销?也许我错过了一些概念?

4

2 回答 2

0

你只是修改数据库吗?我猜想这是 shiro 保持会话并因此“缓存”这个值的预期行为。

如果您想立即销毁用户会话,请执行

//removes all identifying information and invalidates their session too.
currentUser.logout(); 
于 2012-04-20T06:35:27.843 回答
0

我还没有找到很好的解决方案,但我确实找到了解决方案。虽然这个问题可能太老了,无法帮助原始海报,但它可能会帮助其他有同样问题的人。

我已经有一个自定义权限过滤器,可以扩展FormAuthenticationFilter,我所有来自客户端的非 ajax 请求都通过这个过滤器。因此,我添加了一个检查以查看用户帐户是否被锁定在isAccessAllowed(...). 如果它被锁定,那么我将用户注销并让过滤器继续。它会将它们发送到登录页面。

这有一个主要缺点:它本质上是用户驱动的数据库轮询,以查看帐户是否被锁定。

如果锁定帐户的过程能够从用户会话中获取正确的主题并将该会话注销,那就更好了。我可以获得用户的会话,但这似乎没有帮助,因为我无法获得正确的主题对象。更改会话似乎没有帮助。

值得一提的是,Jared Bunting 提出了另一个好主意,但不幸的是,这对我没有用。他的建议是检查何时获得权限和角色,并且不授予某人对锁定帐户的权限。这对我不起作用,因为我单独使用身份验证来让用户获得一些访问权限(不需要其他权限)。

于 2013-09-27T21:37:00.057 回答