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

2023-11-18

原文地址

转载地址

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

什么是角色

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

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

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

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

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

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

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

隐式的访问控制

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

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

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

if (user.hasRole("Project Manager") ) {
    //show the project report button
} else {
    //don't show the button
}

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

脆弱的权限策略

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

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

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

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

if (user.hasRole("Project Manager") || user.hasRole("Department Manager") ) {
    //show the project report button
} else {
    //don't show the button
}

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

  1. 后面如果需求方又回来告诉你说我们又有另一个角色可查看报表,或是前面关于”部门管理员可查看报表”的需求不再需要了,岂不把人累死了。

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

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

显式地访问控制:更好的选择

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

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

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

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

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

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

if (user.isPermitted("projectReport:view:12345")) {
    //show the project report button
} else {
    //don't show the button
}

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

为什么说这种方式更好

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

  • 更少的代码重构: 我们是基于系统的功能(系统的资源及对资源的操作)来进行权限控制,而相应来说,系统的功能需求一旦确定下来后,一段时间内对它的改动相应还是比较少的。只是当系统的功能需求改变时,才会涉及到权限代码的改变。例如上面提到的查看项目报表的功能,显式的权限控制方式不会像传统隐式的RBAC权限控制那样因不同的用户/角色要进行这个操作就需要重构代码;只要这个功能存在,显式的方式的权限控制代码是不需要改变的。

  • 更直观: 保护资源对象、控制对资源对象的操作(对象及对象的行为),这样的权限控制方式更符合人们的思想习惯。正因为符合这种直观的思维方式,面向对象的编辑思想及REST通信模型变得非常成功。

  • 更有弹性: 上面的示例代码中没有写死哪些用户、组或角色可对资源进行什么操作。这意味着它可支持任何安全模型的设计。例如,可以将操作(权限)直接分配给用户 ,或者他们可以被分配到一个角色,然后再将角色与用户关联,或者将多个角色关联到组(group)上,等等。你完全可以根据应用的特点定制权限模型。

  • 外部安全策略管理: 由于源代码只反映资源和行为,而不是用户、组和角色,这样资源/行为与用户、组、角色的关联可以通过外部的模块或专用工具或管理控制台来完成。这意味着在权限需求变化时,开发人员并不需要花费时间来修改代码,业务分析师甚至最终用户就可以通过相应的管理工具修改权限策略配置。

  • 可在运行环境做修改: 因为基于资源的权限控制代码并不依赖于行为的主体(如组、角色、用色),你并没有将行为的主体的字符名词写在代码中,所以你甚至可以在程序运行的时候通过修改主体能对资源进行的操作这样一些方式,通过配置的方式就可应对权限方面需求的变动,再也不需要像隐式的RBAC方式那样需要重构代码。

RBAC新解:Resource-Based Access Control

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

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

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

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

现实世界的例子:Apache Shiro

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

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

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • iis自带的ftp服务器权限设置方法,IIS ftp 权限控制

    2010 08 10 周海汉 2010 8 10 http abloz com linux下用vsftp等程序 xff0c 可以很方便设置ftp 而sftp则更具有安全性 ubuntu自带sftp浏览下载功能 xff0c 相当方便 但工作中
  • casbin的详细理解过程(附图片理解)(rbac模型)

    一 casbin模型 casbin模型又叫PERM模型 xff1a subject sub 访问实体 xff0c object xff08 obj访问的资源 xff09 和action xff08 act访问方法 xff09 eft xff
  • Casbin实现RBAC权限访问控制

    1 了解RBAC RBAC全称 xff1a Role Based Access Control xff08 基于角色的访问控制 xff09 例如我们在设计一个财务管理系统时 xff0c 有CEO 财务 销售等角色会访问该系统 都由角色来决定
  • authorization权限控制_认证、授权、鉴权和权限控制

    1 1 认证 授权 鉴权和权限控制 认证 gt 授权 gt 鉴权 gt 权限控制 1 1 1 认证 identification 认证主要是用来确认访问者的身份 xff0c 确认这个人是不是这个人 常见实现方式是通过用户名和密码 xff0c
  • authorization权限控制_Nacos 权限控制介绍及实战

    方案背景 Nacos自开源依赖 xff0c 权限控制一直需求比较强烈 xff0c 这也反应了用户需求将Nacos部署到生产环境的需求 最新发布的Nacos 1 2 0版本已经支持了服务发现和配置管理的权限控制 xff0c 保障用户安全上生产
  • ERP管理系统的权限控制实现--shiro

    1 Shiro基本原理分析 Authentication 身份认证 登录 验证用户是不是拥有相应的身份 Authorization 授权 即权限验证 验证某个已认证的用户是否拥有某个权限 即判断用户是否能做事情 常见的如 验证某个用户是否拥
  • 手撸一套RBAC权限系统

    文章来源 RBAC权限系统分析 设计与实现 shuwoom com 目前 使用最普遍的权限管理模型正是RBAC Role Based Access Control 模型 这篇文章也主要是介绍基于RBAC的权限管理系统 我会从RBAC是什么
  • SpringBoot基本操作(七)——SpringBoot整合Shiro权限管理(完整demo+界面)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 权限系统与RBAC模型概述[绝对经典]

    0 前言 一年前 我负责的一个项目中需要权限管理 当时凭着自己的逻辑设计出了一套权限管理模型 基本原理与RBAC非常相似 只是过于简陋 当时google了一些权限管理的资料 从中了解到早就有了RBAC这个东西 可惜一直没狠下心来学习 更详细
  • 用户·角色·权限·表

    一 引言 因为做过的一些系统的权限管理的功能虽然在逐步完善 但总有些不尽人意的地方 总想抽个时间来更好的思考一下权限系统的设计 权限系统一直以来是我们应用系统不可缺少的一个部分 若每个应用系统都重新对系统的权限进行设计 以满足不同系统用户的
  • RBAC新解:基于资源的权限管理(Resource-Based Access Control)

    原文地址 转载地址 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的 同时我将讨论一种我认为更好的权限管理方式 什么是角色 当说到程序的权限管理时 人们往往想到角色这一概念 角色是代表一系列可执行的操作或责
  • 无法使用 RBAC 列出部署资源

    我在 Kubernetes 中对用户使用 x509 身份验证 效果很好 然而 虽然提供对部署的访问权限似乎无法正常工作 如下所示 Roles kubectl get rolebindings devops rb n demo o yaml
  • ClusterRoleBinding 需要命名空间

    我有以下内容 apiVersion v1 kind ServiceAccount metadata name SomeServiceAccount kind ClusterRole apiVersion rbac authorization
  • yii2 拒绝用户登录后端

    我有 yii2 高级模板 应用了 RBAC 迁移 我试图学习 RBAC 并遵循Docs 2 0 http www yiiframework com doc 2 0 guide security authorization html 我是用数
  • 如何撤销 Kubernetes 中的客户端证书?

    我按照这篇文章了解了如何为 Kubernetes 集群中的用户设置 RBAC https medium com better programming k8s tips give access to your clusterwith a cl
  • Kubernetes RBAC 动词:不带列表获取,反之亦然?没有列表就看?

    虽然有很多关于 Kubernetes RBAC 的文档和示例 以及不同资源的可用动词 但我找不到任何关于某些动词是否始终组合使用或是否有单独使用它们的用例的规则 我特别想知道动词 get list 和 watch 组合它们 尤其是不组合它们
  • 创建命名空间后自动创建 Kubernetes 资源

    我有2个团队 开发人员 他们每次部署应用程序的分支 标签时都会创建一个新的 Kubernetes 命名空间 ops 它们通过 集群 角色和 集群 角色绑定管理对集群的访问控制 问题是 在 ops 创建 RBAC 资源之前 devs 无法 k
  • 通过访问限制列出的 Kubernetes 命名空间

    我有一套users dev team 谁只需要访问dev and qa命名空间 我创建了一个服务帐户 集群角色和集群角色绑定 如下所示 服务帐号 apiVersion v1 kind ServiceAccount metadata name
  • 基于资源的访问控制与基于角色的访问控制

    我正在学习 Apache Shiro 发现了这篇文章 新的 RBAC 基于资源的访问控制 http www stormpath com blog new rbac resource based access control 作者说 您可以将
  • 允许 Kubernetes 用户列表/获取命名空间

    我有以下用户清单 我希望允许 myapp user 获取集群内所有命名空间的列表 根据我的查找 我应该创建一个 ClusterRole 但我无法真正找到足够的详细信息 是否有所有 apiGroup 以及相应资源和动词的列表 apiVersi

随机推荐

  • JS实现简单的天、时、分、秒倒计时代码

  • Django版本选择、Python兼容问题及更新时间(长期更新)

    先说结果 LTS是长期支持 Long Term Support 的缩写 是官方长期维护的稳定版本 生产环境建议使用LTS版本 最好最好最好不要尝试其他小更新小修补的版本 不做小白鼠 LTS通常是2年内的单数年4月份更新一次 单次版本维护时间
  • 阶段学习总结

    阶段学习总结 从开始学习java到现在已经过了40多天过去了 同时也学习了java中非常重要的一部分就是面向对象的相关知识 面向对象也是java中较难的一部分 因为它是一种抽象的思想 在这一个阶段的学习中学到了很多以前不解的知识点 同时也有
  • java基础知识

    java基础知识 java是一门编程语言 面向对象 是一门开源的计算机语言 曾用名Oak java市场需求 市面比较广 面向对象 可以开发的方面比较多 主要是是应用方面 android app 软件工具 微信小程序 大数据分析 当今社会上手
  • vector的模拟实现

    vector的模拟实现 include
  • MDM主数据平台使用总结

    随着科技飞速发展的时代 企业信息化建设会越来越完善 越来越体系化 所用到的应用系统也会越来越多 业务发展中沉淀了大量数据 但是这些数据没有为企业带来直观价值 没有形成企业的数据资产 所以越来越多的企业进入到了数据治理阶段 对于主数据治理的需
  • ajax跨域请求 session,浅谈Ajax跨域Session和跨域访问

    浅谈Ajax跨域Session和跨域访问 一 关于ajax跨域请求 用jsonp老是不成功 虽然可以返回数据 但是error处报错 原因是返回的数据格式不是jsonp格式 但是用C 构造的请求却能够返回数据 二 第三方的ajax请求肯定是不
  • centos6.5安装rabbitmq方法------只能用centos6.5

    1 下载最新版本的erlang到文件夹opt中 当前版本是20 0 root localhost opt wget http erlang org download otp src 20 0 tar gz 2 下载完成后查看文件 root
  • STS(Spring Tool Suite)使用前准备

    好了 卖了两个月冰激凌 现在又回来做程序员了 发现好多东西已经忘了 所以拿csdn当个记事本 方便我也方便其他和我有同样问题的人 现在打算用spring mvc来做些东西 工具就用sts STS Spring Tool Suite 其实是个
  • mysql 字符集问题整理

    mysql 字符集问题整理 一直对mysql字符集没有明确的概念 mysql为了方便 设置了各种层级的字符集 最近在移植mat数据库时 顺便把这个问题整理清楚 供参考和学习 文章最后有word版本 有两张图片以及不同文字的颜色区分 首先是M
  • C# 的委托事件实现(含代码)

    参考代码 http www pudn com downloads74 sourcecode windows csharp detail271438 html 最近在看一个抛物线的代码 用C 写的 以前接触C 不多 从代码中可以看到与andr
  • 《Blurriness-guided Unsharp Masking》阅读笔记

    Unsharp Masking 反锐化掩模 将原图像通过反锐化掩模进行模糊预处理 相当于采用低通滤波 后与原图逐点做差值运算 然后乘上一个修正因子再与原图求和 以达到提高图像中高频成分 增强图像轮廓的目的 这篇文章提出了一个基于模糊作为导向
  • 【文文殿下】【SDOI2013】随机数生成器 题解

    题意 给你个随机数生成器 f x a f x 1 b mod p 给你初始信息 a b t p f 1 问你几次等于 t 如果不等于输出 1 题解 f n a f n 1 b f n c a n 1 frac b a n 1 a 1 tex
  • Linux系统服务权限维持

    usr lib systemd system linux How to remove systemd services Super User VirusTotal File 334e828a09bd64abb9a4f70256f4d2f8f
  • 创新生产力的新引擎

    随着科技的飞速发展 人工智能 AI 已成为当今时代的一大热点 近年来 生成式AI的崛起 特别是在自然语言处理 NLP 领域的突破 对传统搜索引擎 推荐系统 语言翻译等领域产生了深远的影响 CHAT GPT作为生成式AI的代表之一 更是引领了
  • java中的四种权限修饰符

    因为缺省情况下只能在同包中访问 所以缺省也叫包访问权限 要注意的是 当使用protected修饰父类的成员或者方法 在不同包下访问该父类的资源时 只有使用子类对象才可以去访问 声明一个父类的对象是无法访问该资源的
  • unity 3D获取当前物体得坐标

    unity 3D获取当前物体得坐标 与物体绑定好 public class location MonoBehaviour Start is called before the first frame update public GameOb
  • 2022年“网络安全”赛项驻马店市赛选拔赛 任务书

    2022年 网络安全 赛项驻马店市赛选拔赛 一 竞赛时间 共计3小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 Windows操作系统渗透测试 100分钟 100 任务二 Linux操
  • Linux 中如何使用 Aria2 下载文件

    Aria2是一个免费的开源轻量级多协议命令行实用程序 可以从Internet上下载文件 它支持各种协议 例如HTTP HTTPS FTP甚至BitTorrent Aria2可在Windows Linux和Mac OSX上运行 主要特征 以下
  • RBAC新解:基于资源的权限管理(Resource-Based Access Control)

    原文地址 转载地址 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的 同时我将讨论一种我认为更好的权限管理方式 什么是角色 当说到程序的权限管理时 人们往往想到角色这一概念 角色是代表一系列可执行的操作或责