shiro 动态配置filterChainDefinitionMap
在之前的学习中,项目中Shiro拦截所有请求的配置是默认配置在 applicationContext.xml文件中的。shiroFilter过滤器中的定义了filterChainDefinitions。
权限管理filterChainDefinitions过滤器配置:
<!--
6.配置ShiroFilter
6.1 id必须和web.xml文件中配置的DelegatingFilterProxy的<filter-name>一致。
若不一致,则会抛出:NoSuchBeanDefinitionException。因为Shiro会来 IOC容器中查找和<filter-name>名字对应的filter bean。
-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/toLogin"/>
<property name="successUrl" value="/list"/>
<property name="unauthorizedUrl" value="/unauthorized"/>
<!--
配置哪些页面需要受保护。
以及访问这些页面需要的权限
1) anon 可以匿名访问
2) authc 必须认证(即登录) 之后才可以访问
3) logout:登出
4) roles 角色过滤器
-->
<property name="filterChainDefinitions">
<value>
/toLogin = anon
/login = anon
/logout = logout
/toAdmin = roles[admin]
/toUser = roles[user]
# everything else requires authentication:
/** = authc
</value>
</property>
</bean>
这种方式权限代码是写死的不易扩展。
下面来配置优雅简洁易扩展的 filterChainDefinitions:通过实例工厂方法的方式来创建一个 filterChainDefinitionMap。
filterChainDefinitions源码如下:
实现步骤如下(3步)
步骤1:创建FilterChainDefinitionMapBuilder类,编写一个方法,并返回LinkedHashMap<String, String>:
package com.example.shiro.factory;
import java.util.LinkedHashMap;
public class FilterChainDefinitionMapBuilder {
/**
* 配置FilterChainDefinitionMap
* @return
*/
public LinkedHashMap<String, String> filterChainDefinitionMapBuilder(){
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
//下面数据可以保存在数据库,从数据库获取得到
map.put("/toLogin", "anon");//去登录
map.put("/login", "anon");//登录
map.put("/logout", "logout");//登出
map.put("/toAdmin", "roles[admin]"