清除当前用户的shiro认证缓存(已验证)
//修改成功后清除缓存
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager)SecurityUtils.getSecurityManager();
ShiroRealm shiroRealm = (ShiroRealm) securityManager.getRealms().iterator().next();
// shiroRealm.clearAllCache();
shiroRealm.getAuthenticationCache().remove(username);
对比网上其他方法根本不行,清除缓存不成功。
Subject subject=SecurityUtils.getSubject();
// 调用子类去清理缓存
super.clearCache(subject.getPrincipals());
或者
/**
* 重写方法,清除当前用户的的 授权缓存
* @param principals
*/
@Override
public void clearCachedAuthorizationInfo(PrincipalCollection principals) {
super.clearCachedAuthorizationInfo(principals);
}
/**
* 重写方法,清除当前用户的 认证缓存
* @param principals
*/
@Override
public void clearCachedAuthenticationInfo(PrincipalCollection principals) {
super.clearCachedAuthenticationInfo(principals);
}
@Override
public void clearCache(PrincipalCollection principals) {
super.clearCache(principals);
}
shiroRealm.clearCachedAuthenticationInfo(SecurityUtils.getSubject().getPrincipals());
清除所有缓存(已验证)
在ShiroRealm中定义清除缓存的方法
/**
* 自定义方法:清除所有 授权缓存
*/
public void clearAllCachedAuthorizationInfo() {
getAuthorizationCache().clear();
}
/**
* 自定义方法:清除所有 认证缓存
*/
public void clearAllCachedAuthenticationInfo() {
getAuthenticationCache().clear();
}
/**
* 自定义方法:清除所有的 认证缓存 和 授权缓存
*/
public void clearAllCache() {
clearAllCachedAuthenticationInfo();
clearAllCachedAuthorizationInfo();
}
在业务层调用
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager)SecurityUtils.getSecurityManager();
ShiroRealm shiroRealm = (ShiroRealm) securityManager.getRealms().iterator().next();
shiroRealm.clearAllCache();
根据网上的方法清除用户缓存,不清楚为什么总是清除不成功,根据debug,可以看到在缓存中是以username为key,AuthenticationInfo为value的,这也就是为什么我们用shiroRealm.clearCachedAuthenticationInfo(SecurityUtils.getSubject().getPrincipals());删除不成功的原因。