RBAC 权限设计(转载)

来源 :https://blog.csdn.net/rocher88/article/details/43190743

这是我在网上找的一些设计比较好的RBAC权限管理

不知道,像新浪、搜狐、网易、百度、阿里巴巴、淘宝网的RBAC用户权限这一块,都是这种细颗粒的RBAC设计开发,还是把他们像用户组、角色组、权限组、操作组、资源组的表盒数据等都封装成工具类,持久化曾通过一个数据库视图View或者联合查询,将细颗粒的设计转化成粗颗粒的操作。开发人员不需要关注这些比较细的东西,只需要关注粗颗粒,比如说:用户和角色以及菜单和操作就可以了。其他的什么按钮的曾、删、改、差、分页、文件是否能上传的权限操作,都陪封装的这些操作的实体工具类里面了!!!

RBAC权限管理 
 
扩展accessmenufile

 
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)
 


角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。 
 
当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。(下图为用户组、用户与角色三者的关联关系)
 


在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。(见下图)
 


请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。

这样设计的好处有二。其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。

这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。

到这里,RBAC权限模型的扩展模型的完整设计图如下:
 


随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。

 

另外一个不同的RBAC用户权限管理的设计:


基于RBAC的权限设计模型 

权限分析文档 

基于RBAC的权限设计模型: 

1        RBAC 介绍 

RBAC 模型作为目前最为广泛接受的权限模型。 

NIST (The National Institute of Standards and Technology,美国国家标准与技术研究院)标准RBAC模型由4个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC)、角色分级模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC)[1]。RBAC0模型如图1所示。 



图表 1 RBAC 0 模型 

         RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合 

在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。 

          RBAC1 引入角色间的继承关系 

角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。 

          RBAC2 模型中添加了责任分离关系 

RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。 

          RBAC3 包含了RBAC1和RBAC2 

既提供了角色间的继承关系,又提供了责任分离关系。 

建立角色定义表。定出当前系统中角色。 

因为有继承的问题,所以角色体现出的是一个树形结构。 



2        权限设计: 
 
配置资源以及资源的操作 : 这里资源可以定义为一个通用的资源模型。提供通用的资源统一接口。 
 
数据库 ER 图: 



关系图: 


 


3        分析: 

根据以上的类关系图和ER图可以看出。整个权限可以抽象为五个对象组成。 

OrgBean : 用于描述org模型。 

Role : 用于描述角色。 

Permission : 用于描述权限。 

Resource : 用于描述资源。 

Operation : 用于描述操作。 

其中Permission中有Resource , Operation 的聚合,资源和操作组成权限。 

Role 和 Permission 都有自包含。因为设计到权限的继承。 

资源Resource 也可能出现一颗树形结构,那资源也要有自包含。 

思想 : 

权限系统的核心由以下三部分构成: 1. 创造权限, 2. 分配权限, 3. 使用权限,然后,系统各部分的主要参与者对照如下: 1. 创造权限 - Creator 创造, 2. 分配权限 - Administrator 分配, 3. 使用权限 - User : 

1. Creator 创造 Privilege , Creator 在设计和实现系统时会划分,一个子系统或称为模块,应该有哪些权限。这里完成的是 Privilege 与 Resource 的对象声明,并没有真正将 Privilege 与具体 Resource 实例联系在一起,形成 Operator 。 

2. Administrator 指定 Privilege 与 Resource Instance 的关联 。在这一步, 权限真正与资源实例联系到了一起, 产生了 Operator ( Privilege Instance )。 Administrator 利用 Operator 这个基本元素,来创造他理想中的权限模型。如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等 ... 这些操作都是由 Administrator 来完成的。 

3. User 使用 Administrator 分配给的权限去使用各个子系统。 Administrator 是用户,在他的心目中有一个比较适合他管理和维护的权限模型。于是,程序员只要回答一个问题,就是什么权限可以访问什么资源,也就是前面说的 Operator 。程序员提供 Operator 就意味着给系统穿上了盔甲。 Administrator 就可以按照他的意愿来建立他所希望的权限框架 可以自行增加,删除,管理 Resource 和 Privilege 之间关系。可以自行设定用户 User 和角色 Role 的对应关系。 ( 如果将 Creator 看作是 Basic 的发明者, Administrator 就是 Basic 的使用者,他可以做一些脚本式的编程 ) Operator 是这个系统中最关键的部分,它是一个纽带,一个系在 Programmer , Administrator , User 之间的纽带。 

4        权限API 

   getPermissionByOrgGuid(String orgGuid ) 

      通过传入一个org的Guid , 拿到当前这个org对象都具有那些访问权限。 

 getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid) 

    通过传入一个org的Guid 和 一个资源的Guid , 返回改Org对当前这个资源的访问权限。 

getPermissionByResourceGuid(String resource) 

    通过传入一个资源的Guid , 得到当前资源下都有那些权限定义。 

havingHeritPermission(String orgGuid , String resouceGuid) : Boolean 

    传入一个orgGuid, 资源GUID ,查看改OrgGuid下对资源是否有向下继承的权限。这里继承是资源的继承。即对父栏目有权限,可以继承下去对父栏目下的子栏目同样有权限。 

havingPermission(String orgGuid , String resourceGuid) : Boolean 

    判断某Org对某一资源是否用权限。 

以上是粗粒度的权限API 。 以下为细粒度的权限: 

getOperationByPermission(String permissionGuid) 

    通过permission 的Guid 得到该permission 的所有有效操作。 

getOperationByGuid(String permissionGuid , String resourceGuid) 

    通过permision的Guid , 资源的Guid 得到该资源下所有的有效操作。 

screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid) 

    通过permission , resource , org的Guid 得到改Org对这一资源的有效操作。 

hasOperation(String operationGuid) : boolean 

    通过传入的operationGuid 返回是否具有操作权限。 

5        权限的实现: 

1 .表单式认证,这是常用的,但用户到达一个不被授权访问的资源时, Web 容器就发 

出一个 html 页面,要求输入用户名和密码。 

2 .用 Filter 防止用户访问一些未被授权的资源, Filter 会截取所有 Request/Response , 

然后放置一个验证通过的标识在用户的 Session 中,然后 Filter 每次依靠这个标识来决定是否放行 Response 。 

这个模式分为: 

Gatekeeper :采取 Filter 或统一 Servlet 的方式。 

Authenticator : 在 Web 中使用 JAAS 自己来实现。 

Filter 拦截只是拦截该用户是否有访问这个页面,或这一资源的权限。真正做到显示后拦截是在应用程序内部去做。 

做显示拦截提供API , 标签这两种方式。

转载于:https://www.cnblogs.com/hao-1234-1234/p/8976360.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

54.get set

当程序查询对象属性时调用get方法,如果只有get方法那么他是一个只读属性&#xff0c;//程序对对象属性进行赋值操作时调用set方法&#xff0c;如果只有set方法那么他是是一个只读属性 <script type"text/javascript">var p {x:1.0,y:1.0,//当程序查询对象属性…

Codeforces Round #554 Div.2 E - Neko and Flashback

欧拉路径 神题啊神题&#xff01;这道题的突破口就是后两个数组每个元素是一一对应的。 也就是说&#xff0c;对于一个p的排列&#xff0c;b和c取得每一个元素的下标在p中都是一样的。 根据b和c数组的性质可以得出&#xff0c;b[i] < c[i]。 这也是我们输出-1的一个判断方法…

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结

20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结 教材学习内容总结 本周对JAVA中的多态性进行了学习 多态性引用能够随时间变化指向不同类型的对象&#xff0c;是通过后绑定实现的。实现多态性的主要途径有两种&#xff1a; 1.由继承实现多态性 2.利用接口实现多态…

Linux系统安装Apache 2.4.6

http://www.cnblogs.com/kerrycode/p/3261101.html Apache简介 Apache HTTP Server&#xff08;简称Apache&#xff09;是Apache软件基金会的一个开放源码的网页服务器&#xff0c;可以在大多数计算机操作系统中运行&#xff0c;由于其多平台和安全性被广泛使用&#xff0c;是最…

深浅拷贝

lst1 ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"] lst2 lst1 print(lst1) print(lst2) lst1.append("杨逍") print(lst1) print(lst2) # 结果: # [金毛狮王, 紫衫龙王, 白眉鹰王, 青翼蝠王, 杨逍] # [金毛狮王 紫衫…

lnmp化境开启pathinfo,支持tp5.0等访问

一、 开启pathinfo   #注释 下面这一行 #include enable-php.conf #载入新的配置文件 include enable-php-pathinfo.conf #添加如下location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.php/$1 last;break;}}location ~ /index.php {fastcgi_pass 127.0.0.1:…

深度解密GO语言之反射

反射和 Interface 息息相关&#xff0c;而 Interface 是我们上一篇文章的内容。在开始正文前&#xff0c;和大家说点题外话。 上一篇关于 Interface 的文章发出后&#xff0c;获得了很多的关注和阅读。比如&#xff0c;登上了 GoCN 的每日新闻第一条&#xff1a; 可能是编辑者觉…

Python爬虫-正则表达式

正则表达式 只提取关注的数据&#xff0c;进行数据赛选 原子&#xff1a; 基本组成单位 普通的字符 非打印支付 通用字符 普通的字符 >>> import re >>> pat"yue" >>> string"http://yum.iqianyue.com" >>> rst1re.se…

openfire(一):使用idea编译openfire4.2.3源码

最近公司项目要使用openfire&#xff0c;并对源码做一些修改&#xff0c;使用的openfire版本为官网目前最新版本4.2.3&#xff0c;网上资料较少&#xff0c;踩了很多坑&#xff0c;特此记录。 1.下载源码 http://www.igniterealtime.org/downloads/source.jsp 2.使用idea导入源…

JAVA synchronized关键字锁机制(中)

synchronized 锁机制简单的用法&#xff0c;高效的执行效率使成为解决线程安全的首选。 下面总结其特性以及使用技巧&#xff0c;加深对其理解。 特性: 1. Java语言的关键字&#xff0c;当它用来修饰一个方法或者一个代码块的时候&#xff0c;能够保证在同一时刻最多只有一个线…

Python多线程豆瓣影评API接口爬虫

爬虫库 使用简单的requests库&#xff0c;这是一个阻塞的库&#xff0c;速度比较慢。 解析使用XPATH表达式 总体采用类的形式 多线程 使用concurrent.future并发模块&#xff0c;建立线程池&#xff0c;把future对象扔进去执行即可实现并发爬取效果 数据存储 使用Python ORM sq…

【自制工具类】Java删除字符串中的元素

这几天做项目需要把多个item的id存储到一个字符串中&#xff0c;保存进数据库。保存倒是简单&#xff0c;只需要判断之前是否为空&#xff0c;如果空就直接添加&#xff0c;非空则拼接个“&#xff0c;” 所以这个字符串的数据结构是这样的 String str "a,b,c,d"; 保…

DMA存储器到外设代码讲解

实验目的: bsp_dma_mtp.h #ifndef __BSP_DMA_MTP_H #define __BSP_DMA_MTP_H#include "stm32f10x.h" #include <stdio.h>// 串口工作参数宏定义 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USAR…

java基础集合类——LinkedList 源码略读

1.概览 LinkedList是java的动态数组另一种实现方式&#xff0c;底层是基于双向链表&#xff0c;而不是数组。 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedLis…

[BZOJ] 1688: [Usaco2005 Open]Disease Manangement 疾病管理

1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 727 Solved: 468[Submit][Status][Discuss]Description Alas! A set of D (1 < D < 15) diseases (numbered 1..D) is running through the farm. Farmer John woul…

es6 var、let、const命令

1.let和var <1>let声明的变量仅在块级作用域内有效&#xff1b; var声明的变量在全局有效&#xff1b; <2> var变量乐意在声明之前使用&#xff0c;输出undefined; let 不可以&#xff0c;直接抛出一个错误&#xff1b; 例如&#xff1a;//var 声明console.log(a);…

实例属性和类属

1.Python是动态语言&#xff0c;根据类创建的实例&#xff0c;可以任意绑定属性 2.给实例绑定属性的方法有两种&#xff1a; 通过实例变量或者通过self变量。 1 class Student(object): 2 def __init__(self, name): 3 self.namename 4 5 ##或者如下&#xff1a; 6 &g…

vim中跳到第一行和最后一行

底线命令模式 :0或:1跳到文件第一行 :$跳到文件最后一行 命令模式 gg跳到第一行 shiftg跳到文件最后一行转载于:https://www.cnblogs.com/liuys635/p/10831196.html

bootstrap-table 刷新页面数据

bom.bootstrapTable(load,msg[object]);//这一步 务必要添加。if(msg[code]1){bom.find(tbody).css(display,table-row-group)bom.bootstrapTable({data: msg[object],columns: columns,resizable: true,cache:false,pagination: true,sidePagination: client,pageNumber: 1,pa…

Image-to-Image Translation with conditional Adversarial Networks ---- Pix-2-Pix

任务场景 Photos to semantic segmentationCityscapes labels to photosColorizationFacades labels to photoDay to nightThe edges to photoAnd so on.在生成器模型中&#xff0c;条件变量y实际上是作为一个额外的输入层&#xff08;additional input layer&#xff09;&…