shiro
1 权限管理
1.1 什么是权限管理
- 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授予的资源。
- 权限管理包括用户认证和授权,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有访问该资源的权限才可访问。
1.2 用户身份认证
1.2.1 概念
- 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式就是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则处于指纹;对于硬件key等刷卡系统,则需要刷卡。
1.2.2 用户名密码身份认证流程

1.2.3 关键对象
- 上述流程图中需要理解的关键对象:
- subject:主体
- 访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体。
- principal:身份信息
- 是主体进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱等,一个主体可以有多个身份,但是必须有一个主身份(primary principal)。
- credential:凭证信息
- 只有主体自己知道的安全信息,如密码、证书等。
1.3 授权
1.3.1 概念
- 授权,即访问控制,控制谁能访问那些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。
1.3.2 授权流程

1.3.3 关键对象
- 授权可以理解为who对what(which)进行how的操作。
- who
- 即主体(subject),主体在认证通过后系统进行访问控制。
- what(which)
- 即资源(Resource),如系统菜单、页面、按钮、类方法、系统商店信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为01的商品为资源实例,编号为001的商品信息也属于资源实例。
- 简而言之,主体必须具备资源的访问权限才可以访问该资源。
- how
- 即权限/许可(permission),规定了主体对资源的操作许可,权限离开资源没有任何意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可以知道主体对那些资源有操作许可。
- 权限可以分为粗粒度和细粒度权限,粗粒度权限是指对资源类型的权限,细粒度权限是对资源实例的权限。
- 主体、资源、权限的关系如下图

1.3.4 分配权限
- 用户需要分配相应的权限才可访问相应的资源。权限是对资源的操作许可。
- 通常给用户分配资源权限需要将权限信息持久化,比如储存在关系数据库中。
1.3.5 权限模型
- 针对上述的主体、资源、权限可以通过数据模型来表示。
- 主体(账号、密码等)
- 资源(资源名称、访问地址)
- 权限(权限名称,资源id)
- 角色(角色名称)
- 主体和角色的关系(主体id、角色id)
- 角色和权限的管理(角色id、权限id)

【备注】:
- 为什么权限和资源是多对一的关系?
- 答:在系统中系统是固定的,比如我们写的方法、系统中的按钮、菜单等等,那么,想想对于一个菜单来说,如果我们给系统管理员角色分配全部权限,那么是不是系统管理员可以访问一切资源。而如果我们给人力资源总监角色只分配几个权限,那么是不是人力资源总监也可能可以访问这个菜单。所以综上所述,权限和资源是多对一的关系。
- 但是在通常企业开发中将资源和权限合并为一张权限表
- 权限(权限名称,资源id)
- 资源(资源名称,访问URL)
- 合并为:
- 权限(权限名称、资源名称、资源访问地址)

【备注】:上图被称为权限管理的通用模型,不过企业在开发的时候会根据系统自身的特点进行修改。
1.3.6 权限控制
- 用户拥有了权限即可操作权限范围内的资源,系统不知道主体是否具有访问权限所以需要对用户的访问进行口控制。
1.3.6.1 基于角色的访问控制
- RBAC(Role Based Access Control)基于角色的访问控制,是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等,访问控制流程如下:

- 上图中的逻辑代码如下
if(主体.hasRole("总经理角色")){
查询工资
}
- 这种方式是有缺点:以角色进行访问控制粒度较粗,如上图所示,如果查询工资所需要的角色变化为总经理和部门经理,此时就需要修改逻辑判断为“判断用户的角色是否为总经理角色或部门经理角色”,系统扩展性较差。
- 修改代码如下:
if(主体.hasRole("总经理角色") || 主体.hasRole("部门经理角色")){
查询工资
}
1.3.6.2 基于资源的访问控制
- RBAC(Resource Based Access Control)基于资源的访问控制,比如主体必须具有查询工资权限才可以查询员工工资信息等。
- 实现的逻辑代码如下:
if(主体.hasPermission("查询工资权限")){
查询工资
}
- 优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将“查询工资权限”添加到“部门经理角色”的权限列表中,判断逻辑不用修改,系统可扩展性强。
2 权限管理解决方案
2.1 粗粒度和细粒度
2.1.1 什么是粗粒度和细粒度?
- 对资源类型的管理称为粗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。
- 对资源实例的控制称为细粒度权限管理,即只控制到数据级别的权限。比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。
2.1.2 如何实现粗粒度和细粒度?
- 如何实现粗粒度权限管理?
- 粗粒度权限管理比较容易将权限管理的代码抽取出来在系统架构级别统一处理。比如:通过SpringMVC的拦截器。
- 如何实现细粒度权限管理?
- 对细粒度权限管理在数据级别是没有共性可言的,针对细粒度权限管理就是企业业务逻辑的一部分,如果在也完成处理相对比较简单,如果将细粒度权限管理统一在系统架构级别去抽取,比较困难,即使抽取的功能也存在扩展性不强。
- 建立细粒度权限管理在业务层去控制。
- 比如:部门经理只查询本部门的员工信息,在service层接口提供一个部门id的参数,在Controller层中根据用户的信息得到该用户属于哪个部门,调用Service时将部门id传入Service层,实现该用户只查询本部门员工信息。
2.2 基于URL拦截
- 基于URL拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个URL都配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过滤,过滤器获取到用户访问的URL,只要访问的URL是用户分配角色中的URL则放行继续访问。
- 当然也可以通过Struts2或SpringMVC等的拦截器实现。

2.3 使用权限管理框架
- 对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节约系统开发时间,并且权限管理框架提供了完善的认证和授权功能有利于系统扩展维护,但是学习权限管理框架需要成本,所以选择一款简单高效的权限管理框架显得非常重要。
3 基于URL拦截实现
3.1 搭建环境
- MySQL数据库
CREATE TABLE `sys_permission` ( `id` ) NOT NULL COMMENT '主键', `name` ) NOT NULL COMMENT '资源名称', `type` ) NOT NULL COMMENT '资源类型:menu,button,', `url` ) DEFAULT NULL COMMENT '访问url地址', `percode` ) DEFAULT NULL COMMENT '权限代码字符串', `parentid` ) DEFAULT NULL COMMENT '父结点id', `parentids` ) DEFAULT NULL COMMENT '父结点id列表串', `sortstring` ) DEFAULT NULL COMMENT '排序号', `available` ) DEFAULT NULL COMMENT '是否可用,1:可用,0不可用', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Table structure for table `sys_role` */ CREATE TABLE `sys_role` ( `id` ) NOT NULL, `name` ) NOT NULL, `available` ) DEFAULT NULL COMMENT '是否可用,1:可用,0不可用', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Table structure for table `sys_role_permission` */ CREATE TABLE `sys_role_permission` ( `id` ) NOT NULL, `sys_role_id` ) NOT NULL COMMENT '角色id', `sys_permission_id` ) NOT NULL COMMENT '权限id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Table structure for table `sys_user` */ CREATE TABLE `sys_user` ( `id` ) NOT NULL COMMENT '主键', `usercode` ) NOT NULL COMMENT '账号', `username` ) NOT NULL COMMENT '姓名', `password` ) NOT NULL COMMENT '密码', `salt` ) DEFAULT NULL COMMENT '盐', `locked` ) DEFAULT NULL COMMENT '账号是否锁定,1:锁定,0未锁定', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Table structure for table `sys_user_role` */ CREATE TABLE `sys_user_role` ( `id` ) NOT NULL, `sys_user_id` ) NOT NULL, `sys_role_id` ) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
,,,,,,,,,,,,,,,,,,,,');
');
')
');
INSERT INTO `sys_user_role`(`id`,`sys_user_id`,`sys_role_id`) VALUES ('ebc8a441-c6f9-11e4-b137-0adc305c3f28','zhangsan','ebc8a441-c6f9-11e4-b137-0adc305c'),('ebc9d647-c6f9-11e4-b137-0adc305c3f28','lisi','ebc9d647-c6f9-11e4-b137-0adc305c');
- JDK1.7 、IDEA、SpringMVC+Mybatis、JQuery EasyUI
3.2
shiro的更多相关文章
- shiro<1.2.4反序列化分析
0x01.环境搭建 下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 环境:Tomcat 8.5.27 + idea ...
- (一)Shiro笔记——简介、 架构分析
1. Shiro是什么 Apache Shiro是一个强大灵活的开源安全框架,可以完全处理身份验证,授权,企业会话管理和加密. Apache Shiro的首要目标是易于使用和理解. 安全有时可能非常复 ...
- Spring整合Shiro 权限 角色 用户关系分析
Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...
- Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现 环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d ...
- fastjson及其反序列化分析--TemplatesImpl
fastjson及其反序列化分析 源码取自 https://www.github.com/ZH3FENG/PoCs-fastjson1241 参考 (23条消息) Json详解以及fastjson使用 ...
- [JavaWeb]反序列化分析(二)--CommonCollections1
反序列化分析(二)--CommonCollections1 链子分析 首先新建一个TransformedMap,其中二三参数为可控,后续要用到 当TransformedMap执行put方法时,会分别执 ...
- Java安全之SnakeYaml反序列化分析
Java安全之SnakeYaml反序列化分析 目录 Java安全之SnakeYaml反序列化分析 写在前面 SnakeYaml简介 SnakeYaml序列化与反序列化 常用方法 序列化 反序列化 Sn ...
- shiro550反序列化分析
拖了很久的shiro分析 漏洞概述 Apache Shiro <= 1.2.4 版本中,加密的用户信息序列化后存储在Cookie的rememberMe字段中,攻击者可以使用Shiro的AES加密 ...
- weblogic之CVE-2016-0638反序列化分析
此漏洞是基于CVE-2015-4852漏洞进行黑名单的绕过,CVE-2015-4852补丁主要应用在三个位置上 weblogic.rjvm.InboundMsgAbbrev.class :: Serv ...
- Apache Shiro<=1.2.4反序列化RCE漏洞
介绍:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 漏洞原因:因为shiro对cookie里的rememberme字段进行了反序列化,所以如果知道了 ...
随机推荐
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe
消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...
- 构建混合应用方式之WCF中继
使用VPN或者ER服务建立云服务和本地服务网络通道来搭建混合应用的方式,需要网络设备的配合和比较复杂的网络配置,所以不是特别的方便.如果是不希望对本地网络环境做修改,而只是服务层面的混合,那么可以使用 ...
- 本地服务器 windows server 2008 datacenter conn /as sysdba 提示 ora-01031 insufficient privileges
原因是需要把当前用户administrator(为例)添加到ora_dba组里. 服务器管理器--配置--本地用户和组--组
- Vue--props
组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.要让子组件使用父组件的数据,我们需要通过子组件的 props 选项. 字面量语法 vs 动态语法 初学者常犯 ...
- 剥析surging的架构思想
1.前言 前面第一篇阐述了采用基于.NET CORE微服务架构,应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍.在这篇文章中,我们将剥析surgin ...
- C++第二篇--访问控制
C++第二篇--访问控制 1. 引入 上一篇博文中从结构体引到了类,类当中不仅有数据成员还有一些函数,这些函数被称为成员函数.今天介绍新的内容,类当中的访问控制. 2. 访问控制 当你不添加任何声明, ...
- [C++ Calculator 项目] 基础运算实现
Calculator V1.1 注:这是C++计算器项目第二部分-运算 [基于初始部分增改而得] 源文件已上传至github 主要问题: Ⅰ.运算实现的问题在于( ) + - * /的优先级的处理,以 ...
- 【JAVASCRIPT】event对象
一.preventDefault 与 stopPropagation event.preventDefault() 和 event.stopPropagation() 不是JQuery的方法,是JS ...
- Java 9 揭秘(19. 平台和JVM日志)
Tips 做一个终身学习的人. 在这章中,主要介绍以下内容: 新的平台日志(logging)API JVM日志的命令行选项 JDK 9已经对平台类(JDK类)和JVM组件的日志系统进行了大整. 有一个 ...
- 抓取60000+QQ空间说说做一次数据分析
对于QQ空间的数据一直来是垂涎不已,老早就想偷过来研究研究,这几天闲下来便开始动手... 整个程序的流程为:登录-->获取cookie-->获取所有的好友qq_number-->根据 ...