[原创]Shiro 授权缓存的清除
在Shiro授权时我们开启了缓存,导致更改用户权限无法生效,必须要清除缓存才能生效。Shiro他去查询你当前是否开始缓存和缓存中是否有改Subject的principals。
Shiro查询授权的源码:
protected AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
if (principals == null) {
return null;
}
AuthorizationInfo info = null;
if (log.isTraceEnabled()) {
log.trace("Retrieving AuthorizationInfo for principals [" + principals + "]");
}
//通过CacheManager获取Cache
Cache<Object, AuthorizationInfo> cache = getAvailableAuthorizationCache();
//判断缓存中是否有数据
if (cache != null) {
if (log.isTraceEnabled()) {
log.trace("Attempting to retrieve the AuthorizationInfo from cache.");
}
Object key = getAuthorizationCacheKey(principals);
//根据principals获取改主体的授权数据
info = cache.get(key);
if (log.isTraceEnabled()) {
if (info == null) {
log.trace("No AuthorizationInfo found in cache for principals [" + principals + "]");
} else {
log.trace("AuthorizationInfo found in cache for principals [" + principals + "]");
}
}
}
if (info == null) {
// Call template method if the info was not found in a cache
//缓存中如果没有数据,info自然也就是然后就会去Realm里查询
info = doGetAuthorizationInfo(principals);
// If the info is not null and the cache has been created, then cache the authorization info.
if (info != null && cache != null) {
if (log.isTraceEnabled()) {
log.trace("Caching authorization info for principals: [" + principals + "].");
}
Object key = getAuthorizationCacheKey(principals); /
cache.put(key, info);
}
}
return info;
}
综合上面的代码我们可以知道:
- 首先他是先用CacheManager更具我们当时设置的Key获取的Cache
- 然后判断整体Cache是否为null
- 有数据的话根据我们principals获取授权数据,没有的话去我们的realm查询
看到这我想大家都知道该怎么做了。
因为我这里CacheManager用Redisson整合了所以我是这样写的。在认证成功后加上这两句代码
PrincipalCollection previousPrincipals = SecurityUtils.getSubject().getPrincipals();
cacheManager.getCache(Constant.POWER_REALM_CACHE).remove(previousPrincipals);
对了Constant.POWER_REALM_CACHE是我设置的shiro授权缓存的key。
在定义Realm的构造中
当然你也可以直接super.setName("key”);
这样是一下设置两个,shiro会在后面自动拼接上是认证缓存还是授权缓存
例如我们setName("shiroRealm")
那么他存入的授权缓存key为:shiroRealm.authorizationcache 认证缓存Key为:shiroRealm.authentiactioncache
大家遇到问题要先学会着自己解决,然后再百度哈!
再见!有问题请留言或私信