Loading... 我们之前使用过滤器链都是在 XML 中手动添加和维护的,本章我们来介绍下如何从数据库读取这些过滤器配置,这样做的好处是便于维护,且可以通过程序来添加过滤器配置,因为我们只需要添加一条记录到数据库即可。 <!--more--> 回顾下,之前我们是这样配置的: ```xml <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 登录页面, 未认证时访问需要认证或授权的资源会自动跳转到此页面 --> <property name="loginUrl" value="/login.jsp"/> <!-- 登录成功页面 --> <property name="successUrl" value="/index.jsp"/> <!-- 登录后, 访问未授权的资源会跳转到此页面 --> <property name="unauthorizedUrl" value="/unauthorized.jsp"/> <property name="filterChainDefinitions"> <value> /login.jsp = anon /login = anon /user.jsp = anyRoles[user, admin] /userList.jsp = perms[select:delete] /logout = logout /** = authc </value> </property> </bean> ``` 主要是 `filterChainDefinitions` 属性,现在我们将其修改为: ```xml <property name="filterChainDefinitionMap" ref=""/> ``` 我们点开 `ShiroFilterFactoryBean` 的 `filterChainDefinitionMap` 属性来看下,它是 Map 类型的: ```xml public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) { this.filterChainDefinitionMap = filterChainDefinitionMap; } ``` 这样我们就可以创建一个类,他从数据库读取权限数据组成一个 Map 类型作为返回值即可,这里我们用实例工厂来实现: ```java import java.util.LinkedHashMap; public class FilterChainDefinitionMapBuilder { public LinkedHashMap<String, String> buildFilterChainDefinitionMap() { LinkedHashMap<String, String> map = new LinkedHashMap<>(); // 这里根据自己使用的数据库查询, 将值 put 到 Map 中. return map; } } ``` 使用 `LinkedHashMap` 的原因是为了保证插入顺序有序,具体连接数据库和查询代码这里就不在演示了,自行根据项目使用的 ORM 框架来实现。 最后的配置文件是这样的: ```xml <!-- shiro 过滤器, 要与 web.xml 中的 Filter Name 相同--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 登录页面, 未认证时访问需要认证或授权的资源会自动跳转到此页面 --> <property name="loginUrl" value="/login.jsp"/> <!-- 登录成功页面 --> <property name="successUrl" value="/index.jsp"/> <!-- 登录后, 访问未授权的资源会跳转到此页面 --> <property name="unauthorizedUrl" value="/unauthorized.jsp"/> <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/> </bean> <bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"/> <bean id="filterChainDefinitionMapBuilder" class="im.zhaojun.factory.FilterChainDefinitionMapBuilder"/> ``` 本章代码地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-12/ 最后修改:2022 年 05 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请我喝杯咖啡吧。