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