【权限管理】基础原理篇
2016-03-11 20:08
351 查看
这两天在做移动端之余也接触一点儿权限的知识。。基础,考试,新生都有一定的了解,唯一对权限是最陌生的。在AngularJs的摧残下,不得不找点儿别的事儿来做做。原本想看一点儿关于shiro的东西,经人推荐了一套视频,里面讲解shiro之前先讲解了以下权限的原理部分,感觉特别好。就燕青老师讲的总结一下,让自己印象深刻一下下。个人感觉传智燕青老师讲的这个shiro视频挺好的,推荐大家看看。有想看的可以找我要哦~
权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
授权可简单理解为who对what(which)进行How操作:Who即主体(Subject)
What即资源(Resource),How即权限/许可(Permission)。
主体、资源、权限关系如下图:
对上面的主体、资源、权限通过数据模型表示。
主体(账号、密码)
资源(资源名称、访问地址)
权限(权限名称、资源id)
角色(角色名称)
角色和权限关系(角色id、权限id)
主体和角色关系(主体id、角色id)
如下图:
通常企业开发中将资源和权限表合并为一张权限表,如下:
资源(资源名称、访问地址)
权限(权限名称、资源id)
合并为:
权限(权限名称、资源名称、资源访问地址)
如图:
即映射出了以下几张表:
这几张表是权限的通用表,每个公司可能针对自己的业务会有不同。
对资源类型的管理称为粗颗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。
对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。
对于细颗粒度的权限管理不建议做成系统架构级别的功能,因为对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,建议对数据级别的权限控制在业务层个性化开发,比如:用户只允许修改自己创建的商品信息可以在service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。
对于粗颗粒度的权限管理可以很容易做系统架构级别的功能,即系统功能操作使用统一的粗颗粒度的权限管理。
实现方式两种:
基于url拦截的平时我们遇到的很多,如果用的是框架像SpringMvc,Struts2,我们可以使用他们的拦截器进行拦截,如果不使用框架我们用filter进行过滤。
基于shiro框架完成权限管理,我们下篇详细介绍。
什么是权限管理?
权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。
用户身份认证
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。授权
授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。权限表结构设计
用户身份认证基本用一个用户表就可以进行验证,主要看一下授权表结构设计。授权可简单理解为who对what(which)进行How操作:Who即主体(Subject)
What即资源(Resource),How即权限/许可(Permission)。
主体、资源、权限关系如下图:
对上面的主体、资源、权限通过数据模型表示。
主体(账号、密码)
资源(资源名称、访问地址)
权限(权限名称、资源id)
角色(角色名称)
角色和权限关系(角色id、权限id)
主体和角色关系(主体id、角色id)
如下图:
通常企业开发中将资源和权限表合并为一张权限表,如下:
资源(资源名称、访问地址)
权限(权限名称、资源id)
合并为:
权限(权限名称、资源名称、资源访问地址)
如图:
即映射出了以下几张表:
这几张表是权限的通用表,每个公司可能针对自己的业务会有不同。
权限管理解决方案
管理权限有粗粒度和细粒度之分,粒度不同对待方式不同。
粗粒度
对资源类型的管理称为粗颗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。
细粒度
对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。
如何实现粗粒度和细粒度
对于细颗粒度的权限管理不建议做成系统架构级别的功能,因为对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,建议对数据级别的权限控制在业务层个性化开发,比如:用户只允许修改自己创建的商品信息可以在service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。对于粗颗粒度的权限管理可以很容易做系统架构级别的功能,即系统功能操作使用统一的粗颗粒度的权限管理。
实现方式两种:
(1)基于url拦截
基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问。(2)使用权限框架
对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节省系统开发时间,并且权限管理框架提供了完善的认证和授权功能有利于系统扩展维护,但是学习权限管理框架是需要成本的,所以选择一款简单高效的权限管理框架显得非常重要。我们系统中选择的框架就是shiro。基于url拦截的平时我们遇到的很多,如果用的是框架像SpringMvc,Struts2,我们可以使用他们的拦截器进行拦截,如果不使用框架我们用filter进行过滤。
基于shiro框架完成权限管理,我们下篇详细介绍。
相关文章推荐
- 通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小
- CTO技术管理
- markdown使用基本语法
- 将oracle数据库的编码变成utf-8
- 从jsp或者aspx这种动态页面获取图片并保存到本地
- 获取设备上全部系统app信息
- 轻松学习Ionic (一) 搭建开发环境,并创建工程
- 操作系统实验0
- Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
- Vector,ArrayList,LinkedList,SynchronizedList
- url地址解码、保留小数点后面两位数字
- Java基础复习系列二
- leetcode之 Minimum Height Trees
- 清除浮动的几种方法
- C#取得多段线中圆弧中点坐标
- PHP函数 ------ ctype_alnum
- online_judge_1523
- 实验0 了解和熟悉操作系统 --操作系统
- java.util.zip压缩打包文件总结二: ZIP解压技术
- 2016太原UI设计师讲通道的原理,修图必学