之前在测试的Web工程下,我们在applicationContext.xml中配置了shiroFilter资源拦截器信息:

<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="/list.jsp"/>
<property name="unauthorizedUrl" value="/index.jsp"/>
<!--
配置哪些页面需要受保护.
以及访问这些页面需要的权限.
1). anon 可以被匿名访问
2). authc 必须认证(即登录)后才可能访问的页面.
3). logout 登出
4). roles 角色过滤器
-->
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/userAuth/login = anon
/userAuth/logout = logout

/User.jsp = roles[user]
/admin.jsp = roles[admin]

# everything else requires authentication:
/** = authc
</value>
</property>
</bean>
我们注意到受保护的资源根据对应的权限关系是配死在applicationContext.xml配置文件中的。
这样配是可以的,但是有的时候受保护的资源与权限的关系特别多,这样一个一个配很不方便,
最好的方式是将这些信息配置在数据库中,使用SQL查询的方式将其取出来。那么如何做到呢?

我们注意上面的配置,权限资源都配置在名为“filterChainDefinitions”这个属性中,我们在
编译器中使用Ctrl键加鼠标点击该名称,可以看到它是ShiroFilterFactoryBean的一个属性:

public void setFilterChainDefinitions(String definitions) {
Ini ini = new Ini();
ini.load(definitions);
//did they explicitly state a 'urls' section? Not necessary, but just in case:
Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
if (CollectionUtils.isEmpty(section)) {
//no urls section. Since this _is_ a urls chain definition property, just assume the
//default section contains only the definitions:
section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
}
setFilterChainDefinitionMap(section);
}
发现经过一系列初始化后,它调用了setFilterChainDefinitionMap这个方法,点开这个方法:

public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {
this.filterChainDefinitionMap = filterChainDefinitionMap;
}

我们在该处源码打断点,然后启动测试工程,看一下此处传入什么值:

可以看到,这里传入的是一个LinkedHashMap,其中的键值对就是我们在applicationContext.xml配置文件中filterChainDefinitions属性配置的信息。

所以,我们只需要去构建一个Map,然后将其配置为FilterChainDefinitionMap属性就可以了。
配置方式如下:
首先将filterChainDefinitions注释,然后配置一个filterChainDefinitionMap属性,并连接一个Map信息:

<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="/list.jsp"/>
<property name="unauthorizedUrl" value="/index.jsp"/>
<property name ="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property>
</bean>

然后我们需要去新建并配置一个Bean,通过实例工厂的方式来产生Map。该Bean创建如下:

package com.test.shiro.factory;
import java.util.LinkedHashMap;
public class FilterChainDefinitionMapBuilder {
public LinkedHashMap<String,String> buildFilterChainDefinitionMap(){
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
return map;
}
}

然后在shiroFilter的bean配置下方放置一个实例工厂和通过实例工厂注册的Map实例:

<bean id="filterChainDefinitionMap"
factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"/>

<!-- 配置一个bean,该bean实际上是一个Map,通过实例工厂方法的方式 -->
<bean id="filterChainDefinitionMapBuilder"
class="com.test.shiro.factory.FilterChainDefinitionMapBuilder"/>

最上面的filterChainDefinitionMap就是在shiroFilter中引入的name ="filterChainDefinitionMap"
的property属性。

此时我们就可以在FilterChainDefinitionMapBuilder的buildFilterChainDefinitionMap方法中
对Map进行初始化即可,此时就可以从数据库取出相关权限资源信息传入Map中。我们这里没有连
接数据库,所以就简单模拟一下数据库取出数据的效果,如下:

package com.test.shiro.factory;
import java.util.LinkedHashMap;
public class FilterChainDefinitionMapBuilder {
public LinkedHashMap<String,String> buildFilterChainDefinitionMap(){
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
map.put("/login.jsp","anon");
map.put("/userAuth/login","anon");
map.put("/userAuth/logout","logout");
map.put("/User.jsp","roles[user]");
map.put("/admin.jsp","roles[admin]");
map.put("/**","authc");
return map;
}
}

经过测试,登录jack去访问Admin的Page,是被拒绝的:

所以我们使用实例工厂来初始化资源权限信息是成功的。

转载请注明出处:http://blog.csdn.net/acmman/article/details/78824989

Shiro从数据表中初始化资源和权限的更多相关文章

  1. Shiro-从数据表中初始化资源和权限

    我们在 applicationContext中配置受保护的资源和权限的关系 <property name="filterChainDefinitions"> <v ...

  2. springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、

    要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...

  3. 默认情况下,不使用of子句表示在select所有的数据表中加锁(转)

    Select …forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...

  4. 转:Sql Server中清空所有数据表中的记录

    如果要删除数据表中所有数据只要遍历一下数据库再删除就可以了,清除所有数据我们可以使用搜索出所有表名,构造为一条SQL语句进行清除了,这里我一一给各位同学介绍.   使用sql删除数据库中所有表是不难的 ...

  5. shiro注解,初始化资源和权限,会话管理

     有具体问题的可以参考之前的关于shiro的博文,关于shiro的博文均是一次工程的内容  注解: 新建一个类: 此时需要有admin的权限才可以执行下面的代码 public class ShiroS ...

  6. Sql Server中清空所有数据表中的记录

    Sql Server中清空所有数据表中的记录 清空所有数据表中的记录: 代码如下:exec sp_msforeachtable  @Command1 ='truncate table ?'删除所有数据 ...

  7. code first网站发布后数据表中没有数据问题

    code first网站发布后数据表中没有数据问题 (1).将internal sealed class Configuration类访问修饰符改为public  class Configuratio ...

  8. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  9. excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)

    将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...

随机推荐

  1. Monkey日志中如何找错误

     无响应问题可以在日志中搜索 “ANR” ,崩溃问题搜索 “CRASH” ,内存泄露问题搜索"GC"(需进一步分析),异常问题搜索 “Exception”   monkey执行时未 ...

  2. NOIP2013 DAY2 T3火车运输

    传送门 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况 ...

  3. redis-linux上安装redis

    单机版本 因为redis是c++写的,我们首先需要安装c++环境 1.在linux安装c++源码编译器 需要联网 linux输入yum -y install gcc gcc-c++ 2.官网下载red ...

  4. CentOS 6.9使用sudo时出现:“...不在 sudoers 文件中,此事将被报告”的问题解决

    在终端切换root账号登录 su 修改/etc/sudoers文件 visudo 找到:root ALL=(ALL) ALL,修改成自己的账号: 保存即可,按Exc,输入”:wq!“,回车.

  5. Android Studio怎样删除module

    当你想在Android Studio中删除某个module时,大家习惯性的做法都是选中要删除的module.右键去找delete.可是 在Android Studio中你选中module,右键会发现没 ...

  6. Thread interrupt表示什么

    Thread interrupt表示什么 学习了:https://www.zhihu.com/question/41048032?sort=created 学习了:http://blog.csdn.n ...

  7. GCD&amp;&amp;LCM的一些经典问题

    1.1~n的全部数的最小公倍数:lightoj 1289  传送门 分析:素因子分解可知这个数等于小于1~n的全部素数的最高次幂的乘积 预处理1~n的全部质数,空间较大,筛选的时候用位图来压缩.和1~ ...

  8. linux下Oracle11g RAC搭建(七)

    linux下Oracle11g RAC搭建(七) 六.安装Grid 启动GRID安装界面 方式一:redhat下调整分辨率 [root@node1 ~]# xhost +       //授权 [ro ...

  9. Bootstrap的js插件之警告框(alert.js)

    data-dismiss="alert"--为关闭button加入该属性能够使其自己主动为警告框赋予关闭功能. .fade .in--为警告框在关闭时加入动画效果. 很多其它细节參 ...

  10. 创建quickstart报错

    在cmd中创建helloword成功(一开始是mvn package失败,后面又执行了一遍又成功了,应该是网络问题) 然后在eclipse 中创建quickstart,结果pom报错找不到如下包 ma ...