新的RBAC:基于资源的权限管理(Resource-Based Access Control)

2023-10-27

新的RBAC:基于资源的权限管理(Resource-Based Access Control)

本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的。同时将讨论一种更好的权限管理方式。

What is a Role? 什么是角色

当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列行为或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能“做”什么取决于与之关联的各个角色。

例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目组成员、产生项目报表等。

从这个意义上来说,角色更多的是一种行为的概念:它表示用户能在系统中进行的操作。

Role-Based Access Control 基于角色的访问控制

既然角色代表了可执行的操作这一概念,一个合乎逻辑的做法是在软件开发中使用角色来控制对软件功能和数据的访问。你可能已经猜到,这种权限控制方法就叫基于角色的访问控制(Role-Based Access Control),或简称为 RBAC。

有两种正在实践中使用的 RBAC 访问控制方式:隐式的方式和显示的方式。

今天依旧有大量的软件应用是使用隐式的访问控制方式。但我肯定的说,显示的访问控制方式更适合于当前的软件应用。

Implicit Access Control 隐式的访问控制

前面提到,角色代表一系列的可执行的操作。但我们如何知道一个角色到底关联了哪些可执行的操作呢?

答案是:目前的大多数应用,你并能不明确的知道一个角色到底关联了哪些可执行操作。可能你心里是清楚的(你知道一个有”管理员”角色的用户可以锁定用户帐号、进行系统配置;一个关联了“消费者”这一角色的用户可在网站上进行商品选购),但这些系统并没有明确定义一个角色到底包含了哪些可执行的行为。

拿”项目管理员”来说,系统中并没有对“项目管理员”能进行什么样的操作进行明确定义,它仅是一个字符串名词。开发人员通常将这个名词写在程序里以进行访问控制。例如,判断一个用户是否能查看项目报表,程序员可能会编码如下 参考:

代码块1.隐式地基于角色的权限控制:

if (user.hasRole("Project Manager") ) {
    //显示报表按钮
} else {
    //不显示按钮
<strong>}

在上面的示例代表中,开发人员判断用户是否有“项目管理员”角色来决定是否显示查看项目报表按钮。请注意上面的代码,它并没有明确语句来定义”项目管理员”这一角色到底包含哪些可执行的行为,它只是假设一个关联了项目管理员角色的用户可查看项目报表,而开发人员也是基于这一假设来写 if/else 语句。

Brittle Security Policy 脆弱的权限策略

像上面的权限访问控制是非常脆弱的。一个极小的权限方面的需求的变动都可能导致上面的代码需要重新修改。

举例来说,假如某一天这个开发团队被告知:“哦,顺便说一下,我们需要一个‘部门管理员’角色,他们也可以查看项目报表。请做到这一点。”

这种情况下,开发人员需要找到上面的代码块并将其修改为:

代码块2.修改过的隐式的基于角色的权限控制:

if (user.hasRole("Project Manager") || user.hasRole("Department Manager") ) {
    //显示报表按钮
} else {
    //不显示按钮
}

随后,开发人员需要更新他的测试用例、重新编译系统,还可能需要重走软件质量控制(QA)流程,然后再重新部署上线。这一切仅仅是因为一个微小的权限方面的需求变动!

后面如果需求方又回来告诉你说我们又有另一个角色可查看报表,或是前面关于“部门管理员可查看报表”的需求不再需要了,怎么办?

如果需求方要求动态地创建、删除角色以便他们自己配置角色,又该如何应对呢?

像上面的情况,这种隐式的(静态字符串)形式的基于角色的访问控制方式难以满足需求。理想的情况是如果权限需求变动不需要修改任何代码。怎样才能做到这一点呢?

Explicit Access Control: A Better Way 显式地访问控制:更好的选择

从上面的例子我们看到,当权限需求发生变动时,隐式的权限访问控制方式会给程序开发带来沉重的负担。如果能有一种方式在权限需求发生变化时不需要去修改代码就能满足需求那就好了。理解的情况是,即使是正在运行的系统,你也可以修改权限策略却又不影响最终用户的使用。当你发现某些错误的或危险的安全策略时,你可以迅速地修改策略配置,同时你的系统还能正常使用,而不需要重构代码重新部署系统。

怎样才能达到上面的理想效果呢?我们可以通过显式的(明确的)界定我们在应用中能做的操作来进行。

回顾上面隐式的权限控制的例子,思考一下这些代码最终的目的,想一下它们最终是要做什么样的控制?

从根本上说,这些代码最终是在保护资源(项目报表),是要界定一个用户能对这些资源进行什么样的操作(查看/修改)。当我们将权限访问控制分解到这种最原始的层次,我们就可以用一种更细粒度(更富有弹性)的方式来表达权限控制策略。

我们可以修改上面的代码块,以基于资源的语义来更有效地进行权限访问控制:

代码块3.显式的权限控制:

if (user.isPermitted("projectReport:view:12345")) {
    //显示报表按钮
} else {
    //不显示按钮
}

上面的例子中,我们可明确地看到我们是在控制什么。不要太在意冒号分隔的语法,这仅是一个例子,重点是上面的语句明确地表示了“如果当前用户允许查看编号为12345的项目报表,则显示项目报表按钮”。也就是说,我们明确地说明了一个用户帐号可对一个的资源实例进行的具体的操作。

How is this better? 为什么说这种方式更好

上面最后的示例代码块与前面的代码的主要区别:最后的代码块是基于什么是受保护的, 而不是谁可能有能力做什么。看似简单的区别,但后者对系统开发及部署有着深刻的影响:

  • 更少的代码重构:我们是基于系统的功能(系统的资源及对资源的操作)来进行权限控制,而相应来说,系统的功能需求一旦确定下来后,一段时间内对它的改动相应还是比较少的。只是当系统的功能需求改变时,才会涉及到权限代码的改变。例如上面提到的查看项目报表的功能,显式的权限控制方式不会像传统隐式的 RBAC 权限控制那样因不同的用户/角色要进行这个操作就需要重构代码;只要这个功能存在,显式的方式的权限控制代码是不需要改变的。
  • 资源和操作更直观:保护资源对象、控制对资源对象的操作,这样的权限控制方式更符合人们的思想习惯。正因为符合这种直观的思维方式,面向对象的编辑思想及 REST 通信模型变得非常成功。
  • 安全模型更有弹性:上面的示例代码中没有写死哪些用户、组或角色可对资源进行什么操作。这意味着它可支持任何安全模型的设计。例如,可以将操作(权限)直接分配给用户 ,或者他们可以被分配到一个角色,然后再将角色与用户关联,或者将多个角色关联到组(group)上,等等。你完全可以根据应用的特点定制权限模型。
  • 外部安全策略管理:由于源代码只反映资源和行为,而不是用户、组和角色,这样资源/行为与用户、组、角色的关联可以通过外部的模块或专用工具或管理控制台来完成。这意味着在权限需求变化时,开发人员并不需要花费时间来修改代码,业务分析师甚至最终用户就可以通过相应的管理工具修改权限策略配置。
  • 运行时做修改:因为基于资源的权限控制代码并不依赖于行为的主体(如组、角色、用色),你并没有将行为的主体的字符名词写在代码中,所以你甚至可以在程序运行的时候通过修改主体能对资源进行的操作这样一些方式,通过配置的方式就可应对权限方面需求的变动,再也不需要像隐式的RBAC 方式那样需要重构代码。

The New RBAC: Resource-Based Access Control 基于资源的权限管理

对于上面列出的诸多好处,我重点要说是这种显式的机制带给我们的富有弹性的权限模型。

如果你仍想保留或模拟传统的基于角色的权限访问控制,你可以将权限(可执行的操作)直接分配给某个角色。这种情况下,你依旧是在使用基于角色的权限访问控制方式(不同之处在于你需要明确地界定角色中的权限,而不是传统的使用角色字符串隐式地进行权限控制)。

但在这种新的模型下,已不必再局限于角色了。你可以将权限直接分配给用户、组或其它你觉得可以的对象。

因为上面显式地、基于资源的权限访问控制的诸多好处,或许可以给 RBAC 一个新的定义:“Resource-Based Access Control”。只是我的一个想法:)

Real World Example: Apache Shiro 真实的案例

如果你好奇现实世界有没有被多个系统使用的基于资源的权限控制框架,你可以了解一下Apache Shiro。它是一个java 平台的现代权限管理框架。通过它的权限Permission概念,Shiro 很好地支持基于资源的权限访问控制。

当然,并不需要借用 Shiro 来理解本文所说的一些概念,但 Shiro 对理解本文所讨论的概念及示例有一定的帮助。

参考:

原文链接:

关于我们


「龙归科技」 是一个专注于低代码赋能企业级信息化服务提供商。核心创始人团队来自绿盟安全、红帽开源操作系统、知名游戏玩蟹科技、知名开源社区等专家共同创立。

「龙归科技」 致力于让中国每一个企业拥有专属的自动化办公操作系统,助力企业或政府拥抱 (Cloud Native First)云原生优先战略,帮助客户构筑以「身份与应用」为中心的现代化 IT 基础设施!从而实现 「数字化转型」「软件行业工业化生产」

主打产品:ArkOS方舟操作系统:一个企业级办公自动化操作系统 ,结合自研低代码应用开发平台,构建产业生态,专注为各类企业与组织机构打造一体化全栈云原生平台。系统自带应用包括:ArkID 统一身份认证,ArkIDE,ArkPlatform,App Store 等产品。截至目前,公司已经获得 15个 软件著作权、2个发明专利,并与2020年11月份,获得北京海淀区中关村国家高新技术企业认定。

相关链接:

官网:https://www.longguikeji.com/

文档:https://docs.arkid.longguikeji.com/

开源代码仓库地址:

https://github.com/longguikeji

https://gitee.com/longguikeji

历史文章

  1. 登录的轮子,你还在造?
  2. 企业级单点登录——信息化体系建设基础
  3. 远程办公,你准备好了吗?
  4. 企业信息化,怎样才算数?
  5. 龙归科技 | 对未来的若干猜测
  6. 龙归科技 | 企业办公自动化的未来
  7. 龙归科技 | 软件的成本下降
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的RBAC:基于资源的权限管理(Resource-Based Access Control) 的相关文章

  • GPT系列训练与部署——Colossal-AI环境配置与测试验证

    Colossal AI框架主要特色在于对模型进行并行训练与推理 多GPU 从而提升模型训练效率 可快速实现分布式训练与推理 目前 该框架已集成很多计算机视觉 CV 和自然语言处理 NLP 方向的算法模型 特别是包括GPT和Stable Di
  • Hbuilder We're sorry

    当Webview窗口加载错误地址 如本地页面不存在 或者访问网络资源失败 如无法访问网络 时会自动显示默认错误页面 可以通过以下方法自定义Webview的404等错误页面 设置应用全局默认错误页面 5 App和wap2app 在应用的man
  • OSPF从初学到放弃 2.1

    本来要开开心心写博客的 结果刚刚看见之间知乎上的两个评论被要求修改 两篇评论都是关于同一个问题的 我都有理由怀疑是资本的力量太强大了 说好的舆论自由呢 一群骗子 好气好气好气 OSPF协议及作业 前言 一 OSPF是什么 仔细说一下 二 聊
  • 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例

    一 什么叫爬虫 爬虫 又名 网络爬虫 就是能够自动访问互联网并将网站内容下载下来的程序 它也是搜索引擎的基础 像百度和GOOGLE都是凭借强大的网络爬虫 来检索海量的互联网信息的然后存储到云端 为网友提供优质的搜索服务的 二 爬虫有什么用
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    文章目录 前言 什么是二分查找算法 1 二分查找 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 在排序数组中查找元素的第一个和最后一个位置 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 搜索插入位置
  • USB MSC类存储设备及FatfsR0.14移植

    USB MSC类存储设备及FatfsR0 14移植 效果演示 配置说明 USB MSC类配置 FatFs移植 FatFs的配置 驱动接口 FatFs测试 USB MSC驱动接口完善 效果演示 这里演示了 FatFs挂载SPI Flash设备
  • java中的锁(基础篇)

    乐观锁和悲观锁 悲观锁 适合写操作多的场景 先加锁可以保证写操作时的数据正确 乐观锁 实际开发 Synchronized关键字 悲观锁 加了后同一时间有且只有一个线程可以进入锁内 1 修饰实例方法 作用于当前实例对象加锁 进入同步代码前要获
  • ReinHard颜色迁移

    看到颜色迁移 觉得还蛮有意思的 遂简单看了一下 代码实现好像有错误 但是不知道错误出在哪里 算法参考 https blog csdn net sin geek article details 22443537 https blog csdn
  • SD卡的控制方法与时序

    1 1 SD卡的命令格式 SD卡的指令由6字节 Byte 组成 如下 Byte1 0 1 x x x x x x 命令号 由指令标志定义 如CMD39为100111即16进制0x27 那么完整的CMD39第一字节为01100111 即0x2
  • [Numpy] mgrid与ogrid

    文章目录 numpy mgrid numpy ogrid numpy mgrid numpy lib index tricks nd grid的替代 在给定范围内返回一个ndarray 是网格上的点 import numpy as np 起
  • webpack安装和使用及超详细配置一个基本vue项目的全部流程(包括路由、less、引入图片渲染)

    文章目录 一 搭建一个简单的webpack项目 1 准备工作 2 初始化项目 3 安装并使用webpack 1 使用npm语句安装webpack和webpack cli 2 检测是否安装成功 需要注意点是由于webpack并不是全局安装的
  • 【BMC】简介

    什么是BMC 在介绍BMC之前需要了解一个概念 即平台管理 platform management 平台管理表示的是一系列的监视和控制功能 操作的对象是系统硬件 比如通过监视系统的温度 电压 风扇 电源等等 并做相应的调节工作 以保证系统处
  • Linux配置sar服务

    Linux配置sar服务 下面以suse 为例 其他系统类似 检查是否有安装sar服务 sar服务包含在sysstat软件包中 rpm qa grep sysstat 如果没有安装执行下面的命令安装 zypper install sysst
  • OCR-APP开发总结(一)

    一 解决删除 运行模式 布局的问题 1 直接将对应的xml部分删除 2 将 Java中MainActivity中引用对应的ID部分删除 并将运行模式的值默认 3 效果图 二 裁剪方法 方法1 android自带的crop进行裁剪 缺点 裁剪
  • Spring MVC类型转换的相关说明

    转自 Spring MVC类型转换的相关说明 下文讲采用示例的方式 讲述相关类型说明 如下所示 insert jsp页面的代码如下
  • C++ 命名空间 & 模板

    命名空间 为了区分不同库中相同名称的函数 类 变量等 引入概念 命名空间 它可作为附加信息来帮助区分它们 使用了命名空间即定义了上下文 本质上就是定义了一个范围 定义命名空间 命名空间的定义使用关键字 namespace 后跟命名空间的名称
  • python实现从零搭建图书管理系统

    学习目标 tornado入门学习 异步服务器学习 异步数据库操作 一 虚拟环境 1 1 虚拟环境的创建 mkvirtualenv tornado py3 p python3 1 2 安装tornado pip install tornado
  • QT学习(一)—— 第一个QT项目

    1 1 新建一个项目 添加项目名称 选择Qwidget类 暂时不选择Generate form那个 补充 这里介绍了一下widget mainWindow dialog三种类的关系 编译器用QT自带的 创建完毕 1 2 项目介绍 1 2 1
  • python爬取内容剔除nbsp_Python正则获取、过滤或者替换HTML标签的方法

    本文实例介绍了Python通过正则表达式获取 去除 过滤 或者替换HTML标签的几种方法 具体内容如下 python正则表达式关键内容 python正则表达式转义符 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线或汉字 s 匹配任意
  • CVPR2023:BiFormer阅读笔记

    目录 前言 1 模型的特点 2 双层路由注意力机制 BRA 3 BiFormer的结构 前言 BiFormer是CVPR2023的一篇文章 文中提出自注意力机制作为Transformer的核心模块 可以帮助网络捕捉长距离上下文依赖 但是这种

随机推荐

  • 基于MFC-MSComm控件的PC与单片机串口通信编程

    作者 uedsr542 来源 51hei 使用工具Visual C 6 0 9针RS232串口线一条 P0口带上拉的LED的51最小系统版 打开软件 新建 gt MFC AppWizard exe 再填写工程名和路径 gt 基于对话框 不需
  • Java项目数据迁移怎么做的

    Java项目数据迁移怎么做的 1 A表到B表找字段映射 即两个不同库表先做好数据字段的对应和补齐 2 代码程序 java 做功能 从一个数据库表中读出数据 然后写到另一个数据库表中 技术历练点 多线程 使用线程池 确定核心线程池的数量 使用
  • Android沉浸式和状态栏颜色的修改

    一 前言 关于沉浸式实现的方法网上已经有很多了 但是也有点良莠不齐 在遇到实际项目中的问题之后还是需要查阅大量的博客来对问题进行查证 本博客主要是在解决沉浸式的几个问题之后 对沉浸式的一点总结方便后面再次遇到同样问题时 能够很快的查阅而不至
  • 深度优先找出图中顶点U到顶点V的所有简单路径【C/C++】

    目录 前言 步骤如下 1 对于邻接矩阵 1 1 创建邻接矩阵 1 2 初始化path数组和找到顶点U和顶点V的下标 1 3 FindPath 函数 1 4 测试结果 1 5 改进代码 感谢 果冻的光滑 的指导和帮助 2 对于邻接表 2 1
  • java消息的确认模式

    1 AUTO ACKNOWLEDGE 从消息生产者角度 发送消息后就开始阻塞 直到从消息服务器收到回复 期间如发生异常则认为消息未被传送 从消息服务器角度 非持久消息在接受到消息后通知生产者 并将消息存入内存 持久性消息在接受道消息后先存入
  • mac系统安装搭载Windows系统虚拟机方法教程

    我们都知道macOS系统虽然相对windows系统而言更稳定 但macOS系统中可使用的软件数量较windows系统而言要少很多 对于macOS系统应用少的问题 我们可以使用虚拟机来解决 那么 苹果虚拟机好用吗 整体而言是可以的 苹果虚拟机
  • excel 导出:

    导出 1 模板导出 1 所需jar
  • 【Pytorch with fastai】第 4 章 :底层训练数字分类器

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • !important的使用

    前端css样式 使用的是vue 框架 本身的 css样式中与自定义的名称重复 导致样式被覆盖 原自定义样式 修改后自定义样式 其中 import 具有优先权 提升指定样式规则的应用优先权 参考文章 https www xuebuyuan c
  • 利用ESP8266_01做一个远程控制的智能插座

    手头有一块ESP8266 01WIFI模块 是前段时间在网上买arduino套件时送的 套件中还有一个单路继电器 反正这些东西折腾完了以后也没什么用 就将网上的资料汇总了一下 做了一个远程控制的智能排插 功能非常简单 就是通过手机远程控制排
  • 在Windows上搭建Go开发环境

    Go语言是由谷歌开发的一个高性能 跨平台的编程语言 安装Go 首先先来安装一下Go语言的SDK 目前Go语言的最新版本为Go 1 8 3 Go下载页面列出了各种操作系统的安装包 如果选择Windows MSI安装包的话 会将Go安装到C G
  • 开源库源码分析:Okhttp源码分析(一)

    开源库源码分析 OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了 作为最常用的网络请求库 OkHttp以其强大的功能深受Android开发者的喜爱 比如说我 还有对该库进行二次封装而成的热门库 比如说Retrofit 本
  • Unity 如何实现音频播放后的回调

    using System using System Collections using System Collections Generic using UnityEngine public class soundManager MonoB
  • IDEA创建Maven项目报错- Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model】

    1 报错 今天下了最新版本的maven 在idea中配置好maven好 拉取依赖报错了 2 查看报错日志 报错如下 1 Error injecting constructor java lang NoSuchMethodError org
  • python代码编译反编译

    一 编译 自带模块py compile 可以把 py代码编译成pyc文件 py文件中导入使用 import py compile py compile compile r code01 py 在终端中运行 python m py compi
  • 常见问题记录

    执行数据迁移时报如下错误 sqlalchemy exc IntegrityError pymysql err IntegrityError 1215 Cannot add foreign key constraint 解决方案 创建外键的字
  • JavaMail 发送的邮件附件名乱码

    情景还原 同事收到系统发出的一封邮件 邮件里的附件名称本该是 模板 周汇报 2 docx却显示成了 UTF 8Q E3 80 90 UTF 8Q 2 docx 问题探究 第一反应是附件编码的问题 于是把 MimeMessageHelper
  • 静态链表

    代码来源 晴神 算法笔记 静态链表问题通用解题模板 定义静态链表 struct Node typename data int next XXX node size 使用静态链表时 结构体类型名和结构体变量名不要相同 初始化 XXX初始化为正
  • [Python人工智能] 三十二.Bert模型 (1)Keras-bert基本用法及预训练模型

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章结合文本挖掘介绍微博情感分类知识 包括数据预处理 机器学习和深度学习的情感分类 这篇文章将开启新的内容 Bert 首先介绍Keras bert库安装及基础
  • 新的RBAC:基于资源的权限管理(Resource-Based Access Control)

    新的RBAC 基于资源的权限管理 Resource Based Access Control 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的 同时将讨论一种更好的权限管理方式 What is a Role