第一种方式,就是写死在代码中的方式,第二种方式,是通过查询数据的方式,动态设定权限内容。第二种方式,在实际的工作中,用得比较的多
源码下载地址
https://gitee.com/yellowcong/shior-dmeo/tree/master/test
过滤器
第一种:写死在配置文件中
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;
}
}
通过数据库查询
建表的关联
数据的检索
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
查询到的结果如下图
通过数据库检索的方式来配置角色权限,
建表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 */;