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;
}