用到shiro框架实现权限控制时,根据实际要求,权限在数据库增删改后都要把权限过滤链变化实时更新到服务器中。
1、配置文件里配置的filterchains都是静态的,但实际开发中更多的是从数据库中动态的获取filterchains。
我们都知道ShiroFilterFactoryBean中的setFilterChainDefinitions()是读取配置文件里默认的filterchains,所以我们的思路是重写这个方法,才能达到我们想要的目的:
public class ShiroPermissionFactory extends ShiroFilterFactoryBean {
private PermissService permissService;
/**记录配置中的过滤链*/
public static String definition="";
public PermissService getPermissService() {
return permissService;
}
public void setPermissService(PermissService permissService){
this.permissService = permissService;
}
/**
* 初始化设置过滤链
*/
@Override
public void setFilterChainDefinitions(String definitions) {
definition = definitions;//记录配置的静态过滤链
List<Permission> permissions = permissService.findAll();
Map<String, String> otherChains = new HashMap<String,String>();
permissions.forEach(permiss->{
//perms.add(e)
otherChains.put(permiss.getPermissionUrl(), permiss.getPermissionvalue());
});
//加载配置默认的过滤链
Ini ini = new Ini();
ini.load(definitions);
Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
if (CollectionUtils.isEmpty(section)) {
section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
}