shiro 动态加载权限 数据库及配置文件
动态加载配置文件中的url 和数据库中的配置url
修改权限时 重新加载配置文件中的url 和数据库中的配置url到shiro中
核心
重写org.apache.shiro.spring.web.ShiroFilterFactoryBean.setFilterChainDefinitions()方法 动态加载url权限
清空org.apache.shiro.web.filter.mgt.DefaultFilterChainManager.filterChains权限缓存
清空org.apache.shiro.web.filter.PathMatchingFilter.appliedPaths权限缓存
使用org.apache.shiro.web.filter.mgt.DefaultFilterChainManager.createChain(String, String)添加url权限
加载配置文件中的url 和数据库中的权限
public class MyShiroFilterFactoryBean extends ShiroFilterFactoryBean {
/**记录配置中的过滤链*/
public static String definition="";
private IUserService userService;
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
/**
* 初始化设置过滤链
*/
@Override
public void setFilterChainDefinitions(String definitions) {
definition = definitions;//记录配置的静态过滤链
List<SysMenuVO> permissions = userService.findPermissionAll();
//数据库中的url权限
Map<String, String> otherChains = new HashMap<String,String>();
Map<String, String> values = new HashMap<>();
permissions.forEach(permiss->{
String url = permiss.getUrl();
String itemCode = permiss.getItemCode();
if (values.containsKey(url)) {
String perms = values.get(url);
if (!perms.contains(itemCode)) {
perms =perms+","+itemCode;
values.put(url, perms);
otherChains.put(url,"perms[\""+ perms+"\"]");
}
}else{
values.put(url, itemCode);
otherChains.put(url, "perms["