[原创]Spring boot 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 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;
    }

综合上面的代码我们可以知道:

  1. 首先他是先用CacheManager更具我们当时设置的Key获取的Cache
  2. 然后判断整体Cache是否为null
  3. 有数据的话根据我们principals获取授权数据,没有的话去我们的realm查询

看到这我想大家都知道该怎么做了。

因为我这里CacheManager用Redisson整合了所以我是这样写的。在认证成功后加上这两句代码

PrincipalCollection previousPrincipals = SecurityUtils.getSubject().getPrincipals();
cacheManager.getCache(Constant.POWER_REALM_CACHE).remove(previousPrincipals);
对了Constant.POWER_REALM_CACHE是我设置的shiro授权缓存的key。

在定义Realm的构造中

[原创]Spring boot Shiro授权 授权缓存的清除_第1张图片

当然你也可以直接super.setName("key”);

这样是一下设置两个,shiro会在后面自动拼接上是认证缓存还是授权缓存

例如我们setName("shiroRealm")

那么他存入的授权缓存key为:shiroRealm.authorizationcache 认证缓存Key为:shiroRealm.authentiactioncache

大家遇到问题要先学会着自己解决,然后再百度哈!

再见!有问题请留言或私信

你可能感兴趣的:(Java)