【发布时间】:2014-05-07 13:10:31
【问题描述】:
Shiro 提供缓存功能,但就我而言,我为用户使用动态角色和权限。我需要使特定用户的缓存过期(如果有),以便权限更改立即影响用户。
领域中有一个方法,但是我如何获取关联领域的实例来调用方法来清除缓存。
【问题讨论】:
标签: permissions shiro cache-invalidation
Shiro 提供缓存功能,但就我而言,我为用户使用动态角色和权限。我需要使特定用户的缓存过期(如果有),以便权限更改立即影响用户。
领域中有一个方法,但是我如何获取关联领域的实例来调用方法来清除缓存。
【问题讨论】:
标签: permissions shiro cache-invalidation
我最终在 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 注入到任何需要它的地方。
【讨论】:
如果您查看 AuthorizingRealm 中方法 getAuthorizationInfo 的来源,您会发现它只是使用键/值存储来缓存授权信息。
它使用 PrincipalCollection 对象作为键。
所以如果你调用类似的东西:
realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals())
缓存通常应该被清除。
【讨论】: