@Service
public class ShiroServiceImpl {
@Autowired
@Qualifier("shiroFilter")
private ShiroFilterFactoryBean shiroFilterFactoryBean;
@Autowired
@Qualifier("loginServiceImpl")
private LoginService loginService;
/**
* 初始化权限
*/
public Map<String, String> loadFilterChainDefinitions() {
// 权限控制map.从数据库获取
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
filterChainDefinitionMap.put("/login/loginUser", "anon");
filterChainDefinitionMap.put("/login/logout","anon");
filterChainDefinitionMap.put("/login/getcaptcha","anon");
filterChainDefinitionMap.put("/bootstrap/css/**", "anon");
filterChainDefinitionMap.put("/bootstrap/fonts/**", "anon");
filterChainDefinitionMap.put("/bootstrap/js/**", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/h-ui/**", "anon");
filterChainDefinitionMap.put("/image/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
List<ShiroMenuUrl> shiroMenuUrlList = loginService.selectShiroMenuUrl();
for(ShiroMenuUrl shiroMenuUrl : shiroMenuUrlList){
filterChainDefinitionMap.put(shiroMenuUrl.getUrl(), "authc,perms[" + shiroMenuUrl.getShiroUrl() +"]");
}
filterChainDefinitionMap.put("/**", "authc");
return filterChainDefinitionMap;
}
/**
* 重新加载权限
*/
public void updatePermission() {
synchronized (shiroFilterFactoryBean) {
AbstractShiroFilter shiroFilter;
try {
shiroFilter = (AbstractShiroFilter) shiroFilterFactoryBean.getObject();
} catch (Exception e) {
throw new RuntimeException("get ShiroFilter from shiroFilterFactoryBean error!");
}
PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter.getFilterChainResolver();
DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver.getFilterChainManager();
// 清空老的权限控制
manager.getFilterChains().clear();
shiroFilterFactoryBean.getFilterChainDefinitionMap().clear();
shiroFilterFactoryBean.setFilterChainDefinitionMap(loadFilterChainDefinitions());
// 重新构建生成
Map<String, String> chains = shiroFilterFactoryBean.getFilterChainDefinitionMap();
for (Map.Entry<String, String> entry : chains.entrySet()) {
String url = entry.getKey();
String chainDefinition = entry.getValue().trim().replace(" ", "");
manager.createChain(url, chainDefinition);
}
System.out.println("更新权限成功!!");
}
}
}