RBAC新解 - 基于资源的权限管理
1、什么是角色
当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列可执行的操作或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能做什么取决于与之关联的各个角色。
例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目组成员、产生项目报表等。
从这个意义上来说,角色更多的是一种行为的概念:它表示用户能在系统中进行的操作。
2、基于角色的访问控制(Role-Based Access Control)
既然角色代表了可执行的操作这一概念,一个合乎逻辑的做法是在软件开发中使用角色来控制对软件功能和数据的访问。你可能已经猜到,这种权限控制方法就叫基于角色的访问控制(Role-Based Access Control),或简称为RBAC。
有两种正在实践中使用的RBAC访问控制方式:隐式(模糊)的方式和显示(明确)的方式。
今天依旧有大量的软件应用是使用隐式的访问控制方式。但我肯定的说,显示的访问控制方式更适合于当前的软件应用。
3、隐式的访问控制
前面提到,角色代表一系列的可执行的操作。但我们如何知道一个角色到底关联了哪些可执行的操作呢?
答案是:目前的大多数应用,你并能不明确的知道一个角色到底关联了哪些可执行操作。可能你心里是清楚的(你知道一个有”管理员”角色的用户可以锁定用户帐号、进行系统配置;一个关联了”消费者”这一角色的用户可在网站上进行商品选购),但这些系统并没有明确定义一个角色到底包含了哪些可执行的行为。
拿”项目管理员”来说,系统中并没有对”项目管理员”能进行什么样的操作进行明确定义,它仅是一个字符串名词。开发人员通常将这个名词写在程序里以进行访问控制。例如,判断一个用户是否能查看项目报表,程序员可能会编码如下:
代码块1.隐式地基于角色的权限控制:
在上面的示例代表中,开发人员判断用户是否有”项目管理员”角色来决定是否显示查看项目报表按钮。请注意上面的代码,它并没有明确语句来定义”项目管理员”这一角色到底包含哪些可执行的行为,它只是假设一个关联了项目管理员角色的用户可查看项目报表,而开发人员也是基于这一假设来写if/else语句。
4、脆弱的权限策略
像上面的权限访问控制是非常脆弱的。一个极小的权限方面的需求的变动都可能导致上面的代码需要重新修改。
举例来说,假如某一天这个开发团队被告知:“哦,顺便说一下,我们需要一个’部门管理员’角色,他们也可以查看项目报表。请做到这一点。”
这种情况下,开发人员需要找到上面的代码块并将其修改为:
代码块2.修改过的隐式的基于角色的权限控制:
随后,开发人员需要更新他的测试用例、重新编译系统,还可能需要重走软件质量控制(QA)流程,然后再重新部署上线。这一切仅仅是因为一个微小的权限方面的需求变动!
后面如果需求方又回来告诉你说我们又有另一个角色可查看报表,或是前面关于”部门管理员可查看报表”的需求不再需要了,岂不把人累死了。
如果需求方要求动态地创建、删除角色以便他们自己配置角色,又该如何应对呢?
像上面的情况,这种隐式的(静态字符串)形式的基于角色的访问控制方式难以满足需求。理想的情况是如果权限需求变动不需要修改任何代码。怎样才能做到这一点呢?
5、显式地访问控制:更好的选择
从上面的例子我们看到,当权限需求发生变动时,隐式的权限访问控制方式会给程序开发带来沉重的负担。如果能有一种方式在权限需求发生变化时不需要去修改代码就能满足需求那就好了。理解的情况是,即使是正在运行的系统,你也可以修改权限策略却又不影响最终用户的使用。当你发现某些错误的或危险的安全策略时,你可以迅速地修改策略配置,同时你的系统还能正常使用,而不需要重构代码重新部署系统。
怎样才能达到上面的理想效果呢?我们可以通过显式的(明确的)界定我们在应用中能做的操作来进行。
回顾上面隐式的权限控制的例子,思考一下这些代码最终的目的,想一下它们最终是要做什么样的控制?
从根本上说,这些代码最终是在保护资源(项目报表),是要界定一个用户能对这些资源进行什么样的操作(查看/修改)。当我们将权限访问控制分解到这种最原始的层次,我们就可以用一种更细粒度(更富有弹性)的方式来表达权限控制策略。
我们可以修改上面的代码块,以基于资源的语义来更有效地进行权限访问控制:
代码块3.显式的权限控制:
上面的例子中,我们可明确地看到我们是在控制什么。不要太在意冒号分隔的语法,这仅是一个例子,重点是上面的语句明确地表示了“如果当前用户允许查看编号为12345的项目报表,则显示项目报表按钮”。也就是说,我们明确地说明了一个用户帐号可对一个的资源实例进行的具体的操作。
6、为什么说这种方式更好
上面最后的示例代码块与前面的代码的主要区别:最后的代码块是基于什么是受保护的, 而不是谁可能有能力做什么。看似简单的区别,但后者对系统开发及部署有着深刻的影响:
更少的代码重构:我们是基于系统的功能(系统的资源及对资源的操作)来进行权限控制,而相应来说,系统的功能需求一旦确定下来后,一段时间内对它的改动相应还是比较少的。只是当系统的功能需求改变时,才会涉及到权限代码的改变。例如上面提到的查看项目报表的功能,显式的权限控制方式不会像传统隐式的RBAC权限控制那样因不同的用户/角色要进行这个操作就需要重构代码;只要这个功能存在,显式的方式的权限控制代码是不需要改变的。更直观:保护资源对象、控制对资源对象的操作(对象及对象的行为),这样的权限控制方式更符合人们的思想习惯。正因为符合这种直观的思维方式,面向对象的编辑思想及REST通信模型变得非常成功。更有弹性:上面的示例代码中没有写死哪些用户、组或角色可对资源进行什么操作。这意味着它可支持任何安全模型的设计。例如,可以将操作(权限)直接分配给用户 ,或者他们可以被分配到一个角色,然后再将角色与用户关联,或者将多个角色关联到组(group)上,等等。你完全可以根据应用的特点定制权限模型。外部安全策略管理:由于源代码只反映资源和行为,而不是用户、组和角色,这样资源/行为与用户、组、角色的关联可以通过外部的模块或专用工具或管理控制台来完成。这意味着在权限需求变化时,开发人员并不需要花费时间来修改代码,业务分析师甚至最终用户就可以通过相应的管理工具修改权限策略配置。可在运行环境做修改:因为基于资源的权限控制代码并不依赖于行为的主体(如组、角色、用色),你并没有将行为的主体的字符名词写在代码中,所以你甚至可以在程序运行的时候通过修改主体能对资源进行的操作这样一些方式,通过配置的方式就可应对权限方面需求的变动,再也不需要像隐式的RBAC方式那样需要重构代码。
7、RBAC新解:Resource-Based Access Control
对于上面列出的诸多好处,我重点要说是这种显式的机制带给我们的富有弹性的权限模型。
如果你仍想保留或模拟传统的基于角色的权限访问控制,你可以将权限(可执行的操作)直接分配给某个角色。这种情况下,你依旧是在使用基于角色的权限访问控制方式(不同之处在于你需要明确地界定角色中的权限,而不是传统的使用角色字符串隐式地进行权限控制)。
但在这种新的模型下,已不必再局限于角色了。你可以将权限直接分配给用户、组或其它你觉得可以的对象。
因为上面显式地、基于资源的权限访问控制的诸多好处,或许可以给RBAC一个新的定义:“Resource-Based Access Control”。只是我的一个想法:)
8、现实世界的例子:Apache Shiro
如果你好奇现实世界有没有被多个系统使用的基于资源的权限控制框架,你可以了解一下Apache Shiro。它是一个Java平台的现代权限管理框架。通过它的权限(Permission)概念,Shiro很好地支持基于资源的权限访问控制。
当然,并不需要借用Shiro来理解本文所说的一些概念,但Shiro对理解本文所讨论的概念及示例有一定的帮助。
相关文章:
《C#精彩实例教程》小组阅读07 -- C#字符与字符串
本微信图文详细介绍了C#中的字符与字符串。

syslog打印不带等级_printk的日志级别和控制台级别
printk根据日志级别(loglevel)对消息进行分类。日志级别用宏定义,日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接成一个字符串,因此printk 函数中日志级别宏和格式字符串间不能有逗号。下面是两个printk的例子,…
《C#精彩实例教程》小组阅读08 -- C#流程控制语句
本微信图文详细介绍了C#的流程控制语句。

ASPJPEG缩略图生成函数
好久没有发文章,贴一段代码出来晒晒!一段aspjpeg组件生成缩略图的代码,有4种生成方式,建议用最后一种,生成的缩略图最清晰而且不会拉伸、变形!做图片生成最好不过!// 缩略图生成函数 Code By S…

java面试题收集
2019独角兽企业重金招聘Python工程师标准>>> 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? HTTP&…

mobile还有人用吗 spring_话说,苹果手机语音备忘录功能还有人用吗?
hi,各位,苹果手机自带的语音备忘录功能还有人在用吗?前两天,有小伙伴在后台留言问:“苹果手机语音备忘录怎么恢复?”小编一时还有些恍惚“它是什么,手机上有吗?”,好在通…

MVC5 + EF6 完整入门教程三
期待已久的EF终于来了。 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程。 本次将会完成EF数据模型的搭建和使用。 基于这个模型,将之前的示例添加数据库查询验证功能。 文章提纲 概述 & 要点 详细步骤 总结 概述 & 要点 下面是本文要点&…
Matlab编程与数据类型 -- 内联函数
本微信图文详细介绍了Matlab中的内联函数。

优化营商环境建议个人_优化营商环境的几点建议(三)
优化临沂的营商环境,重点是做好招商引资的后续环境优化!事关一个地区的财税收入,所以放眼全国,招商引资到哪里都是重点工作。早在2018年4月16日,临沂就召开了新旧动能转换暨开放型经济、招商引资工作动员大会ÿ…
基于Matlab的神经网络结合遗传算法在非线性函数极值寻优中的应用
本微信图文利用神经网络进行非线性函数数据的拟合并通过遗传算法对训练后的神经网络进行非线性函数极值寻优。

十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数
2019独角兽企业重金招聘Python工程师标准>>> 这是十分钟成为 TiDB Contributor 系列的第二篇文章,让大家可以无门槛参与大型开源项目,感谢社区为 TiDB 带来的贡献,也希望参与 TiDB Community 能为你的生活带来更多有意义的时刻。 …

研究生要这样度过!(转)
研究生要这样度过! 首先要知道研究生期间做什么?我认为研究生期间学生应该学三件事情: 1)建立合理的知识结构:尽量广地涉猎学科基本知识,尽量深地了解所研究领域的 方方面面、过去和现在 2)掌握…

后端开发面试自我介绍_字节跳动暑期实习后端开发面试经历
字节跳动后端实习是什么,字节跳动后端实习面试流程是怎样?今天小编就来帮助大家了解一下字节跳动后端实习面试到底有什么内容。(好了不皮了,开始正文)字节的面试流程总的来说还是挺享受的,和面试官两人的思…
《C#精彩实例教程》小组阅读09 -- C#数组与集合
本微信图文详细介绍了C#的数组与集合。

Oracle执行计划突变诊断之统计信息收集问题
Oracle执行计划突变诊断之统计信息收集问题1. 情形描述DB version:11.2.0.4WITH SQL1 AS(SELECT LAC,CI,TO_NUMBER(C.LONGITUDE) LONGITUDE,TO_NUMBER(C.LATITUDE) LATITUDEFROM MB_SYS_CELL_INFO CWHERE C.CONTY_NAME 道孚县), SQL2 AS(SELECT DISTINCT IMSI, LA…

安装gym库_强化学习Gym库学习实践(一)
最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的。想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!ÿ…

VS2005编译QT4.8.2
为什么要编译? 因为安装安装版的QT4.8.2,vs2005编译报错。 1.下载QT4.8.2,qt-everywhere-opensource-src-4.8.2.zip,下载vs-AddIn1.1.11. 2.解压QT源码包到C盘, 这里路径为 c:\qt\4.8.2\。 3.配置系统环境变量…

Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)
大龙的博客C博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理 Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译) Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads不要用Win32 API PostThreadMessage…
Matlab编程与数据类型 -- 文本M文件
本微信图文详细介绍了Matlab中的文本M文件。

安卓x86_Android:虚拟机体验基于安卓10的BlissOS V12.2 Android X86版
我是科技鲁工,今天带来基于Android10的x86版本的Bliss os的安装体验。喜欢的朋友可以关注支持一下。Bliss OS是一个基于Android x86项目的开源操作系统,能让您在PC电脑或平板电脑设备上运行最新的Android 10操作系统。该系统基于AOSP(Android开放源代码项…
《C#精彩实例教程》小组阅读10 -- C#属性与方法
本微信图文详细介绍了C#的属性与方法。

JavaScript中几个重要的知识点(1) ---- 面向对象
JavaScript中几个最重要的大知识点 面向对象DOM事件异步交互ajax面向对象 在JS中可以把任意的引用和变量都看成是一个对象。面向对象的主要三个表现形式: 封装继承多态1. 封装 1.1 单例模式 var obj{name: "sam",age: 12,method: function(){var objNamet…

scrollLeft,scrollWidth,clientWidth,offsetWidth到底指的哪到哪的距离
轉自:http://www.cnblogs.com/mrhgw/archive/2006/11/08/553737.html 补充: scrollHeight: 获取对象的滚动高度。 scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的…

连接服务器_命令行连接FTP服务器
Windows下: 打开命令行窗口,输入 ftp,进入ftp命令模式: 输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121。如下图: 输入Windows下的用户名,然后输入密码(注意:密码是不显示的,输入用户名密码不能时间太长,否则连接断掉)。 查看ftp服务器中的文件,输…

mapreduce作业reduce被大量kill掉
之前有一段时间。我们的hadoop2.4集群压力非常大。导致提交的job出现大量的reduce被kill掉。同样的job执行时间比在hadoop0.20.203上面长了非常多。这个问题事实上是reduce 任务启动时机的问题,因为yarn中没有map slot和reduce slot的概念,且ResourceMan…
Matlab编程与数据类型 -- M文件的编辑和存储
本微信图文详细介绍了Matlab中M文件的编辑和存储。

一个老工程师对理工科学生的忠告
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行…

64 安装_解决“不能安装 64 位Office,因已安装 32 位 Office 产品”问题
换了个电脑装64位的Office 2010(Office_64),双击setup刚准备装,就收到以下错误提示:“不能安装 64 位版本的 Office 2010,因为您当前已经安装 32 位 Office 产品。64 位安装不支持 32 位产品安装:如果要安装 64 位 Off…

Python---内置函数
一、数值类操作 abs(x)求绝对值 1、参数可以是整型,也可以是复数 2、若参数是复数,则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数 注意:整型、浮点型都可以float([x])将一个字符串或数转换为浮点数。如果无参…
《C#精彩实例教程》小组阅读11 -- C#结构与类
本微信图文详细介绍了C#的结构与类。