如何在Shiro中清除主题的缓存

时间:2014-03-28 07:25:01

标签: permissions shiro cache-invalidation

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

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

2 个答案:

答案 0 :(得分:6)

我最终公开了私有方法" clearCachedAuthorizationInfo"在AuthorizingRealm的扩展领域。然后传递校长。

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注入。

答案 1 :(得分:1)

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

它使用PrincipalCollection对象作为键。

所以,如果你打电话给:

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

通常应该清除缓存。