【问题标题】:Shiro immediate user lockingShiro 立即用户锁定
【发布时间】:2012-04-30 13:57:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: java security shiro


    【解决方案1】:

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

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

    //removes all identifying information and invalidates their session too.
    currentUser.logout(); 
    

    【讨论】:

    • 奇怪的是Shiro在会话中缓存了认证信息,却没有缓存授权信息。如果我更改用户权限,它会立即应用,但不会对用户帐户进行更改。
    • 我想这与事情的变化频率有关。权限更改比身份验证信息更频繁。而且还取决于领域的实现。
    • 顺便说一句:锁定功能是开箱即用的吗?我只使用 shiro 作为 grails 插件,我的领域不支持锁定用户...
    • Ralf,锁定不是开箱即用的,而是需要自定义领域(除非我错过了什么)。另外上述解决方案的问题是我没有锁定主题,所以我无法将他注销。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2012-12-28
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多