动态跟新shiro权限

本文深入探讨了Shiro权限配置的实现方式,通过重写MyShiroFilterFactoryBean类,详细解释了如何自定义过滤链定义,包括角色权限的设置和更新机制。这为理解Shiro框架的权限管理提供了实用的代码示例。
public class MyShiroFilterFactoryBean extends ShiroFilterFactoryBean{
	private static final String ROLE_STRING = "roles[${0}]";
	private String fiterChainDefinitions;
	@Override
	public void setFilterChainDefinitions(String definitions) {
		// TODO Auto-generated method stub
		fiterChainDefinitions = definitions;
		Ini ini = new Ini();
	    ini.load(definitions);
	        //did they explicitly state a 'urls' section?  Not necessary, but just in case:
	    Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
	    if (CollectionUtils.isEmpty(section)) {
	            //no urls section.  Since this _is_ a urls chain definition property, just assume the
	            //default section contains only the definitions:
	            section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
	    }
	    
	
		Map<String,String[]> permsMap = new HashMap<>();
		permsMap.put("/dotest1", new String[]{"test"});
		permsMap.put("/dotest2", new String[]{"test","guest"});
//		permsMap.put("/dotest3", new String[]{"admin"});
		for(String url:permsMap.keySet()){
			String[] roles = permsMap.get(url);
			StringBuilder sb = new StringBuilder();
			for(String role:roles){
				sb.append(role).append(",");
			}
			String str = sb.substring(0,sb.length()-1);
			section.put(url, MessageFormat.format(ROLE_STRING, str));
			System.out.println(url);
		}
		this.setFilterChainDefinitionMap(section);
	}
	
	public void update(){
		synchronized (this) {
			try{
				AbstractShiroFilter filter = (AbstractShiroFilter) this.getObject();
				PathMatchingFilterChainResolver resolver = (PathMatchingFilterChainResolver) filter.getFilterChainResolver();
				DefaultFilterChainManager manager = (DefaultFilterChainManager) resolver.getFilterChainManager();
				manager.getFilterChains().clear();
				this.getFilterChainDefinitionMap().clear();
//				this.setFilterChainDefinitions("/dotest3.html=authc,roles[admin]");
				this.setFilterChainDefinitions(fiterChainDefinitions);
			    Map<String, String> chains = getFilterChainDefinitionMap();
		        if (!CollectionUtils.isEmpty(chains)) {
		            for (Map.Entry<String, String> entry : chains.entrySet()) {
		                String url = entry.getKey();
		                String chainDefinition = entry.getValue();
		                manager.createChain(url, chainDefinition);
		            }
		        }
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

}

需要重新实现ShiroFilterFactoryBean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值