public void refreshAuth() {
try {
Ini ini = new Ini();
ini.load("/static/**=anon");
Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
section.put("/js/**", "anon");
section.put("/css/**", "anon");
section.put("/images/**", "anon");
section.put("/lib/**", "anon");
Map<String, Object> filterMap = new HashMap<String, Object>();
filterMap.put("resourceStatus", SysResourceEnum.status.START.key);
//查询菜单与资源绑定视图
menuResourceViewManager.getLoadSection(section);
AbstractShiroFilter shiroFilter = (AbstractShiroFilter) shiroFileterFactoryBean.getObject();
PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter.getFilterChainResolver();
DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver.getFilterChainManager();
manager.getFilterChains().clear();
shiroFileterFactoryBean.getFilterChainDefinitionMap().clear();
shiroFileterFactoryBean.setFilterChainDefinitionMap(section);
// 重新构建生成
Map<String, String> chains = shiroFileterFactoryBean.getFilterChainDefinitionMap();
for (Map.Entry<String, String> entry : chains.entrySet()) {
String url = entry.getKey();
String chainDefinition = entry.getValue().trim().replace(" ", "");
manager.createChain(url, chainDefinition);
}
logger.info("**************权限控制加载完毕**************");
} catch (SelectException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
上面这段代码是修改系统权限之后重新刷新权限的操作,Shiro的用户权限是保存在缓存中的所以在集群中当用户权限更新时我们只需要删除对应的缓存就好了,但系统权限缓存不一样。
Shiro的系统缓存是被加载到一个HashMap里也就是ShiroFilterFactoryBean.filters这个变量,当我们调用上面那段代码去重新加载系统权限的时候也只能重新加载当前请求服务器的系统权限并不能影响到集群中其它服务器所缓存的系统权限,这块应该算是shiro的一个设计问题,这块的问题可以使用Redis的消息订阅、JGroup组播等方式或解决集群问题。