【问题标题】:How to clear cache for a subject in Shiro如何在 Shiro 中清除主题的缓存
【发布时间】:2014-05-07 13:10:31
【问题描述】:

Shiro 提供缓存功能,但就我而言,我为用户使用动态角色和权限。我需要使特定用户的缓存过期(如果有),以便权限更改立即影响用户。

领域中有一个方法,但是我如何获取关联领域的实例来调用方法来清除缓存。

【问题讨论】:

    标签: permissions shiro cache-invalidation


    【解决方案1】:

    我最终在 AuthorizingRealm 的扩展领域中暴露了私有方法“clearCachedAuthorizationInfo”。然后只需传递主体即可。

    public class MyRealm extends AuthorizingRealm {
        //...
        @Override
        public void clearCachedAuthorizationInfo(PrincipalCollection principals)
        {
            super.clearCachedAuthorizationInfo(principals);
        }
        //...
    }
    

    清除授权缓存:

    realm.clearCachedAuthorizationInfo( SecurityUtils.getSubject().getPrincipals() );
    

    我认为这更干净/更安全,因为此方法对缓存上的null 进行了额外检查,并确保您获得对缓存的引用(如果存在)。简单地调用getAuthorizationCache() 不会这样做,并且可能会或可能不会一直工作。

    您确实需要维护对领域的引用。我通过 Spring 初始化 Shiro,然后将其作为 Singleton bean 注入到任何需要它的地方。

    【讨论】:

    • 您好,感谢您的回复。但我没有使用 spring,所以我必须使用 INI 配置 shiro,他们将如何获得 shiro 使用的领域实例。我试图通过java代码配置shiro,但是java代码配置不起作用它说没有配置领域。
    • 要获取所有可用的领域,您可以使用: Collection realms = ((RealmSecurityManager)SecurityUtils.getSecurityManager()).getRealms();然后,您可以查看哪些领域具有公开清除授权信息的方法并在这些领域上调用它。
    【解决方案2】:

    如果您查看 AuthorizingRealm 中方法 getAuthorizationInfo 的来源,您会发现它只是使用键/值存储来缓存授权信息。

    它使用 PrincipalCollection 对象作为键。

    所以如果你调用类似的东西:

    realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals())
    

    缓存通常应该被清除。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2020-08-31
      • 2019-09-29
      • 1970-01-01
      • 2012-02-24
      • 2012-01-31
      • 2017-02-20
      • 2019-09-18
      • 2022-01-22
      相关资源
      最近更新 更多