shiro 刷新认证以及权限缓存(略坑)

这里提供两种清除用户缓存的方法

1、通过ehcache清除缓存(已验证)

这种方法简单明了,适合对cache比较了解的人

思路:从shiroCacheManager获取用户的认证缓存,以及权限缓存,然后根据principal(username等可以确定用户信息的key,在配置shiro的时候由用户指定)对cache进行remove操作。

代码:

@Resource(name = "shiroCacheManager")
private CacheManager shiroCacheManager;

@Override
public void removeUserAuthorization(String userName) {
    Cache cache = shiroCacheManager.getCache("authorizationCache");
    if (cache == null) {
        throw ApplicationExceptionFactory.getSyncApplicationException(90014);
    }

    cache.remove(new SimplePrincipalCollection(userName, USER_REALM_NAME));
}

这里需要注意一点,就是这里 cache.remove(new SimplePrincipalCollection(userName,USER_REALM_NAME))

这里不能直接使用 cache.remove(username),因为shiro初始化cache的啥时候,使用的key的类型是SimplePrincipalCollection,所以,传过去的key必须是这个类型,否则删除失败(这里是个坑,看到网上很多教程直接用ccache.remove(userName)),其次,这里的常量,USER_REALM_NAME是在自定义realm初始化的时候设置的,还有,cache的名字也是在配置的时候设置的(cache.xml里面配置的名字也要和配置的相同,否则找不到cache,而使用defaultCache),具体见以下代码:

/**
     * 自定义db认证
     *
     * @return 认证域
     */
    @Bean
    public AuthorizingRealm userRealm() {
        return new UserRealm() {
            {
                /* 在这里配置user_realm的名字 */
                setName(USER_REALM_NAME);
                /* 允许缓存 */
                setCachingEnabled(true);

                /* 允许认证缓存 */
                setAuthenticationCachingEnabled(true);
                setAuthenticationCacheName("authenticationCache");

                /* 允许授权缓存 */
                setAuthorizationCachingEnabled(true);
                setAuthorizationCacheName("authorizationCache");
            }
        };
    }

2、网上的方法,通过shiro给定的方法清除缓存(已验证)

/** 
     * 重新赋值权限(在比如:给一个角色临时添加一个权限,需要调用此方法刷新权限,否则还是没有刚赋值的权限) 
     * @param myRealm 自定义的realm 
     * @param username 用户名 
     */  
    public static void reloadAuthorizing(MyRealm myRealm,String username){  
        Subject subject = SecurityUtils.getSubject();   
        String realmName = subject.getPrincipals().getRealmNames().iterator().next();   
        //第一个参数为用户名,第二个参数为realmName,test想要操作权限的用户   
        SimplePrincipalCollection principals = new SimplePrincipalCollection(username,realmName);   
        subject.runAs(principals);   
        myRealm.getAuthorizationCache().remove(subject.getPrincipals());   
        subject.releaseRunAs();  
    }  
出处:点击打开链接
myRealm.getAuthorizationCache().remove(subject.getPrincipals()); 

这里是realm给的方法,通过这个方法,可以清除缓存。


总结:

    两种方法各有有缺,给位挑选自己喜欢的方法是用就好,个人是比较偏向第一种,逻辑更清晰,明确。

你可能感兴趣的:(spring,shiro)