前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shiro 进阶之从数据库读取过滤器链

Shiro 进阶之从数据库读取过滤器链

作者头像
一份执着✘
发布2018-10-08 10:02:31
2.2K1
发布2018-10-08 10:02:31
举报
文章被收录于专栏:赵俊的Java专栏赵俊的Java专栏

我们之前使用过滤器链都是在 XML 中手动添加和维护的,本章我们来介绍下如何从数据库读取这些过滤器配置,这样做的好处是便于维护,且可以通过程序来添加过滤器配置,因为我们只需要添加一条记录到数据库即可。

回顾下,之前我们是这样配置的:

代码语言:javascript
复制
<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 属性,现在我们将其修改为:

代码语言:javascript
复制
<property name="filterChainDefinitionMap" ref=""/>

我们点开 ShiroFilterFactoryBeanfilterChainDefinitionMap 属性来看下,它是 Map 类型的:

代码语言:javascript
复制
public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {
	this.filterChainDefinitionMap = filterChainDefinitionMap;
}

这样我们就可以创建一个类,他从数据库读取权限数据组成一个 Map 类型作为返回值即可,这里我们用实例工厂来实现:

代码语言:javascript
复制
import java.util.LinkedHashMap;

public class FilterChainDefinitionMapBuilder {

    public LinkedHashMap<String, String> buildFilterChainDefinitionMap() {
        LinkedHashMap<String, String> map = new LinkedHashMap<>();

        // 这里根据自己使用的数据库查询, 将值 put 到 Map 中.

        return map;
    }
}

使用 LinkedHashMap 的原因是为了保证插入顺序有序,具体连接数据库和查询代码这里就不在演示了,自行根据项目使用的 ORM 框架来实现。

最后的配置文件是这样的:

代码语言:javascript
复制
<!-- 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/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档