shiro框架不需要重启动态更新权限资源

2 篇文章 0 订阅
1 篇文章 0 订阅
public void updatePermission() {
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            ServletContext servletContext = request.getSession().getServletContext();
            AbstractShiroFilter shiroFilter = (AbstractShiroFilter) WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext).getBean("shiroFilter");
            synchronized (shiroFilter) {
                // 获取过滤管理器
                PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter.getFilterChainResolver();
                DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver.getFilterChainManager();
                
                // 清空初始权限配置
                manager.getFilterChains().clear();
                
                
                // 重新获取资源
                Map<String, String> chains = obtainPermission();

                for (Map.Entry<String, String> entry : chains.entrySet()) {
                    String url = entry.getKey();
                    String chainDefinition = entry.getValue().trim().replace(" ", "");
                    System.out.println(url+"\t-----> "+chainDefinition);
                    manager.createChain(url, chainDefinition);
                }
                log.debug("update shiro permission success...");
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }

1.从Spring的bean工厂中获取 shiroFilter

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="successUrl" value="/dispatcher/successUrl" />
		<property name="loginUrl" value="/dispatcher/login" />
		<property name="unauthorizedUrl" value="/dispatcher/unauthorized" />
		<property name="filters">
			<map>
				<entry key="anyRoles" value-ref="hasAnyRoles"/>
				<entry key="logout" value-ref="logout" />
				<entry key="sysUser" value-ref="sysUserFilter"/>
				<entry key="jCaptchaValidate" value-ref="jCaptchaValidateFilter"/>
			</map>
		</property>
		<!-- 注入URL-拦截器链 -->
		<property name="filterChainDefinitionMap" ref="securityMetaDataSource"/>
	</bean>

Shiro hasAnyRoles

public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
        
        Subject subject = getSubject(request, response);   
        String[] rolesArray = (String[]) mappedValue;   
  
        if (rolesArray == null || rolesArray.length == 0) {   
            return true;   
        }   
  
        for(int i=0;i<rolesArray.length;i++){    
            if(subject.hasRole(rolesArray[i])){    
                return true;    
            }    
        }    
        return false;    
        
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值