第一种方式,就是写死在代码中的方式,第二种方式,是通过查询数据的方式,动态设定权限内容。第二种方式,在实际的工作中,用得比较的多

源码下载地址

https://gitee.com/yellowcong/shior-dmeo/tree/master/test

过滤器

Shiro之拦截器的使用-yellowcong_Data

第一种:写死在配置文件中

ShiroFilterFactoryBean中的filterChainDefinitions,直接在xml文件中配置死了

<!-- Shior的过滤器配置 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
       <property name="securityManager" ref="securityManager" />  
       <!-- 用户登录地址 -->
       <property name="loginUrl" value="/user/login" />  
       <!-- 登录成功 -->
       <property name="successUrl" value="/user/list" />  
       <!-- 未授权的钦奎光 -->
       <property name="unauthorizedUrl" value="/user/error" />  

       <property name="filterChainDefinitions">
        <value>
            <!--  设置访问用户list页面需要授权操作-->
               /user/list = authc 
               /user/error =  anon
               /users/user/login = anon
                <!--配置js和img这些静态资源被任何人访问到-->
               /resources/img/** = anon  
               /resources/js/** = anon  
        </value>
       </property>
   </bean>

第二种,数据库动态获取

第二种,修改的是ShiroFilterFactoryBean的filterChainDefinitionMap ,通过工厂方式,动态生成权限。

<!-- Shior的过滤器配置 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
       <property name="securityManager" ref="securityManager" />  
       <!-- 用户登录地址 -->
       <property name="loginUrl" value="/user/login" />  
       <!-- 登录成功 -->
       <property name="successUrl" value="/user/list" />  
       <!-- 未授权的钦奎光 -->
       <property name="unauthorizedUrl" value="/user/error" />  

       <!-- 通过工厂模式,获取数据库里面 权限配置-->
       <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
   </bean> 
   <!-- 获取Bean里面的Map集合 -->
   <bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionsMapBuilder" factory-method="loadFilterChainDefinitions"/>

   <!-- 读取初始自定义权限内容-->
   <bean id="filterChainDefinitionsMapBuilder" class="com.yellowcong.shior.realm.FilterChainDefinitionsMapBuilder" />

自定义的类FilterChainDefinitionsMap

这个类在这个地方只是简单的写死的权限,但是在开发中,可以通过读取数据库里面的权限配置,来设定。

package com.yellowcong.shior.realm;

import java.util.LinkedHashMap;

/**
 * 创建日期:2017年12月17日
 * 创建时间:下午9:39:30
 * 创建者    :yellowcong
 * 机能概要:
 */
public class FilterChainDefinitionsMapBuilder {


    /**
     * 获取权限
     * @return
     */
    public LinkedHashMap<String, String> loadFilterChainDefinitions(){
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
        //优先匹配前面的配置,这一点需要注意的
        //设置访问用户list页面需要授权操作
        map.put("/user/error", "anon");
        map.put("/users/user/login", "anon");
        //配置js和img这些静态资源被任何人访问到
        map.put("/resources/img/**", "anon");
        map.put("/resources/js/**", "anon");
        map.put("/user/list", "authc");
        map.put("/user/admin", "roles[admin]");
        map.put("/**", "authc");
        return map;
    }
}

通过数据库查询

建表的关联

Shiro之拦截器的使用-yellowcong_SQL_02

数据的检索

SELECT 
    B.NAME,
    C.URL,
    B.`type`
  FROM
    SYS_ROLE_PERMISSION A,
    SYS_ROLE B,
    SYS_PERMISSION  C
  WHERE A.ROLE_ID = B.ID 
    AND A.PERMISSION_ID = C.ID 
    -- 对于/** 最后授权的 放在最后 
    AND C.URL != '/**' 
 UNION ALL
 SELECT 'anon','/**','shiro' FROM DUAL

查询到的结果如下图

Shiro之拦截器的使用-yellowcong_Data_03

通过数据库检索的方式来配置角色权限,

Shiro之拦截器的使用-yellowcong_主键_04

建表sql

/*
SQLyog v10.2 
MySQL - 5.5.57 : Database - yellowcong
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`yellowcong` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `yellowcong`;

/*Table structure for table `sys_permission` */

DROP TABLE IF EXISTS `sys_permission`;

CREATE TABLE `sys_permission` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(32) DEFAULT NULL COMMENT '权限名称',
  `url` varchar(225) NOT NULL COMMENT '权限',
  KEY `url` (`url`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

/*Data for the table `sys_permission` */

insert  into `sys_permission`(`id`,`name`,`url`) values (9,'用户错误','/user/error'),(10,'用户登录','/users/user/login'),(11,'静态图片资源','/resources/img/**'),(12,'静态js资源','/resources/js/**'),(13,'用户主页','/user/list'),(14,'管理员用户控制页面','/user/admin'),(15,'普通用户控制页面','/user/user'),(16,'用户登出','/user/loginOut'),(17,'所有资源','/**');

/*Table structure for table `sys_role` */

DROP TABLE IF EXISTS `sys_role`;

CREATE TABLE `sys_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(32) DEFAULT NULL COMMENT '角色名称',
  `type` varchar(32) DEFAULT NULL COMMENT '角色类型',
  `comment` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Data for the table `sys_role` */

insert  into `sys_role`(`id`,`name`,`type`,`comment`) values (1,'anon','shiro','shiro拦截器'),(2,'authc','shiro','shiro拦截器'),(3,'admin','roles','管理员'),(4,'user','roles','普通用户'),(5,'logout','shiro','shiro拦截器');

/*Table structure for table `sys_role_permission` */

DROP TABLE IF EXISTS `sys_role_permission`;

CREATE TABLE `sys_role_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `role_id` int(11) DEFAULT NULL COMMENT '关联角色',
  `permission_id` int(11) DEFAULT NULL COMMENT '关联权限',
  PRIMARY KEY (`id`),
  KEY `role_id` (`role_id`),
  KEY `permission_id` (`permission_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

/*Data for the table `sys_role_permission` */

insert  into `sys_role_permission`(`id`,`role_id`,`permission_id`) values (1,1,9),(2,1,10),(3,1,11),(4,1,12),(5,2,13),(6,3,14),(7,4,15),(8,5,16),(9,2,17);

/*Table structure for table `sys_user` */

DROP TABLE IF EXISTS `sys_user`;

CREATE TABLE `sys_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `username` varchar(32) DEFAULT NULL COMMENT '用户名',
  `is_disable` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否禁用',
  `is_locked` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否上锁',
  `is_expired` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否过期',
  `email` varchar(32) DEFAULT NULL COMMENT '邮箱',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

/*Data for the table `sys_user` */

insert  into `sys_user`(`id`,`password`,`username`,`is_disable`,`is_locked`,`is_expired`,`email`,`last_login_time`,`create_time`) values (1,'4748f3d238406505bd50e5accc3a8aa2','yellowcong',0,0,0,NULL,NULL,NULL),(12,'4748f3d238406505bd50e5accc3a8aa2','test',1,0,0,NULL,NULL,NULL),(13,'4748f3d238406505bd50e5accc3a8aa2','test2',0,1,0,NULL,NULL,NULL),(14,'4748f3d238406505bd50e5accc3a8aa2','doubi',0,0,1,NULL,NULL,NULL),(16,NULL,NULL,0,0,0,NULL,NULL,NULL);

/*Table structure for table `sys_user_role` */

DROP TABLE IF EXISTS `sys_user_role`;

CREATE TABLE `sys_user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` int(11) DEFAULT NULL,
  `role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `role_id` (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `sys_user_role` */

insert  into `sys_user_role`(`id`,`user_id`,`role_id`) values (1,1,3),(2,12,4);

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;