Shiro 提供缓存功能,但在我的例子中,我为用户使用动态角色和权限。我需要使特定用户的缓存过期(如果有的话),以便权限更改立即影响用户。
Realm 中有一个方法,但是我如何获取关联领域的实例来调用方法来清除缓存。
最佳答案
我最终在 AuthorizingRealm 的扩展领域中公开了私有(private)方法“clearCachedAuthorizationInfo”。然后只需传递委托(delegate)人即可。
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 注入(inject)。
关于permissions - 如何清除 Shiro 中主题的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22706632/