Shiro提供了缓存功能,但就我而言,我使用的是动态角色和权限。我需要使特定用户的缓存过期(如果有),以便权限的更改立即影响用户。
Realm中有一个方法,但是如何获取关联领域的实例来调用方法来清除缓存。
答案 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())
通常应该清除缓存。