系统架构与设计(1)- 权限系统的设计以及主流的五种权限模型

news/2024/5/19 7:21:56/文章来源:https://www.cnblogs.com/tkuang/p/16717131.html

 

作者:码猿技术专栏
来源:https://juejin.cn/post/7121977695197970463

-------------------------------------------------------------------

这篇文章就来介绍一下权限系统的设计以及主流的五种权限模型。

权限管控可以通俗的理解为权力限制,即不同的人由于拥有不同权力,他所看到的、能使用的可能不一样。对应到一个应用系统,其实就是一个用户可能拥有不同的数据权限(看到的)和操作权限(使用的)。

主流的权限模型主要分为以下五种:

  • ACL 模型:访问控制列表
  • DAC 模型:自主访问控制
  • MAC 模型:强制访问控制
  • ABAC 模型:基于属性的访问控制
  • RBAC 模型:基于角色的权限访问控制

1. ACL 模型:访问控制列表

  Access Control List,ACL 是最早的、最基本的一种访问控制机制,是基于客体进行控制的模型,在其他模型中也有 ACL 的身影。为了解决相同权限的用户挨个配置的问题,后来也采用了用户组的方式。

原理:每一个客体都有一个列表,列表中记录的是哪些主体可以对这个客体做哪些行为,非常简单。

例如:当用户A要对一篇文章进行编辑时,ACL 会先检查一下文章编辑功能的控制列表中有没有用户A,有就可以编辑,无则不能编辑。或不同等级的会员在产品中可使用的功能范围不同。

缺点:当主体的数量较多时,配置和维护工作就会成本大、易出错。

 

2. DAC 模型:自主访问控制

  Discretionary Access Control,DAC 是 ACL 的一种拓展。

  原理:在 ACL 模型的基础上,允许主体可以将自己拥有的权限自主地授予其他主体,所以权限可以任意传递。

  例如:常见于文件系统,LINUX,UNIX、WindowsNT 版本的操作系统都提供 DAC 的支持。

  缺点:对权限控制比较分散,例如无法简单地将一组文件设置统一的权限开放给指定的一群用户。主体的权限太大,无意间就可能泄露信息。

 

3. MAC 模型:强制访问控制

  Mandatory Access Control,MAC 模型中主要的是双向验证机制。常见于机密机构或者其他等级观念强烈的行业,如军用和市政安全领域的软件。

  原理:主体有一个权限标识,客体也有一个权限标识,而主体能否对该客体进行操作取决于双方的权限标识的关系。

  例如:将军分为上将>中将>少将,军事文件保密等级分为绝密>机密>秘密,规定不同军衔仅能访问不同保密等级的文件,如少将只能访问秘密文件;当某一账号访问某一文件时,系统会验证账号的军衔,也验证文件的保密等级,当军衔和保密等级相对应时才可以访问。

  缺点:控制太严格,实现工作量大,缺乏灵活性。

 

4. ABAC 模型:基于属性的访问控制

  Attribute-Based Access Control,能很好地解决 RBAC 的缺点,在新增资源时容易维护。

  原理:通过动态计算一个或一组属性是否满足某种机制来授权,是一种很灵活的权限模型,可以按需实现不同颗粒度的权限控制。

属性通常有四类:

    1)主体属性,如用户年龄、性别等;

    2)客体属性,如一篇文章等;

    3)环境属性,即空间限制、时间限制、频度限制;

    4)操作属性,即行为类型,如读写、只读等。

  例如:早上 9:00 ~ 11:00 期间 A、B 两个部门一起以考生的身份考试,下午 14:00 ~ 17:00 期间 A、B 两个部门相互阅卷。

  缺点:规则复杂,不易看出主体与客体之间的关系,实现非常难,现在应用的很少。

 

5. RBAC 模型:基于角色的权限访问控制

  Role-Based Access Control,核心在于用户只和角色关联,而角色代表对了权限,是一系列权限的集合。

  RBAC 三要素:

    1)用户:系统中所有的账户

    2)角色:一系列权限的集合(如:管理员,开发者,审计管理员等)

    3)权限:菜单,按钮,数据的增删改查等详细权限。

 

  在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。

  角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。

  角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系同样也存在继承关系防止越权。

  优点:便于角色划分,更灵活的授权管理;最小颗粒度授权;

 

6. RBAC 模型的深度拓展

  RBAC 模型可以分为:RBAC0、RBAC1、RBAC2、RBAC3 四个阶段,一般公司使用 RBAC0 的模型就可以。另外,RBAC0 相当于底层逻辑,后三者都是在 RBAC0 模型上的拓展。

  先简单介绍下这四个RBAC模型:

   1)RBAC0 模型

    用户和角色、角色和权限多对多关系。

    简单来说就是一个用户拥有多个角色,一个角色可以被多个用户拥有,这是用户和角色的多对多关系;同样的,角色和权限也是如此。

    RBAC0 模型如下图:没有画太多线,但是已经能够看出多对多关系。

 

  2)RBAC1 模型

    相对于 RBAC0 模型,增加了角色分级的逻辑,类似于树形结构,下一节点继承上一节点的所有权限,如 role1 根节点下有 role1.1 和role1.2 两个子节点

  角色分级的逻辑可以有效的规范角色创建(主要得益于权限继承逻辑),我之前做过 BD 工具(类CRM),BD 之间就有分级(经理、主管、专员),如果采用 RBAC0 模型做权限系统,我可能需要为经理、主管、专员分别创建一个角色(角色之间权限无继承性),极有可能出现一个问题,由于权限配置错误,主管拥有经理都没有权限。

  而 RBAC1 模型就很好解决了这个问题,创建完经理角色并配置好权限后,主管角色的权限继承经理角色的权限,并且支持针对性删减主管权限。

 

  3)RBAC2模型

    基于RBAC0模型,对角色增加了更多约束条件。

  角色互斥,比较经典的案例是财务系统中出纳不得兼管稽核,那么在赋予财务系统操作人员角色时,同一个操作员不能同时拥有出纳和稽核两个角色。

  角色数量限制,例如:一个角色专门为公司 CEO 创建的,最后发现公司有10个人拥有 CEO 角色,一个公司有10个 CEO?这就是对角色数量的限制,它指的是有多少用户能拥有这个角色。

  RBAC2 模型主要是为了增加角色赋予的限制条件,这也符合权限系统的目标:权责明确,系统使用安全、保密。

 

  4)RBAC3模型

    同样是基于 RBAC0 模型,但是综合了 RBAC1 和 RBAC2 的所有特点。

    这里就不在多描述,读者返回去看 RBAC1 和 RBAC2 模型的描述即可。

 

7. RBAC 权限管理的在实际系统中的应用

  RBAC 权限模型由三大部分构成,即用户管理、角色管理、权限管理。

  用户管理按照企业架构或业务线架构来划分,这些结构本身比较清晰,扩展性和可读性都非常好。

  角色管理一定要在深入理解业务逻辑后再来设计,一般使用各部门真实的角色作为基础,再根据业务逻辑进行扩展。

  权限管理是前两种管理的再加固,做太细容易太碎片,做太粗又不够安全,这里我们需要根据经验和实际情况来设计。

 

  1)用户管理

    用户管理中的用户,是企业里每一位员工,他们本身就有自己的组织架构,我们可以直接使用企业部门架构或者业务线架构来作为线索,构建用户管理系统。

    

    需要特殊注意:实际业务中的组织架构可能与企业部门架构、业务线架构不同,需要考虑数据共享机制,一般的做法为授权某个人、某个角色组共享某个组织层级的某个对象组数据。

 

   2)角色管理

    在设计系统角色时,我们应该深入理解公司架构、业务架构后,再根据需求设计角色及角色内的等级。

    一般角色相对于用户来说是固定不变的,每个角色都有自己明确的权限和限制,这些权限在系统设计之处就确定了,之后也轻易不会再变动。

    (1)自动获得基础角色 

      当员工入职到某部门时,该名员工的账号应该自动被加入该部门对应的基础角色中,并拥有对应的基础权限。这种操作是为了保证系统安全的前提下,减少了管理员大量手动操作。使新入职员工能快速使用系统,提高工作效率。

    (2)临时角色与失效时间 

      公司业务有时需要外援来支持,他们并不属于公司员工,也只是在某个时段在公司做支持。此时我们需要设置临时角色,来应对这种可能跨多部门协作的临时员工。

      如果公司安全级别较高,此类账号默认有固定失效时间,到达失效时间需再次审核才能重新开启。避免临时账号因为流程不完善,遗忘在系统中,引起安全隐患。

    (3)虚拟角色

      部门角色中的等级,可以授权同等级的员工拥有相同的权限,但某些员工因工作原因,需要调用角色等级之外的权限,相同等级不同员工需要使用的权限还不相同。

      这种超出角色等级又合理的权限授予,我们可以设置虚拟角色。这一虚拟角色可集成这一工作所需的所有权限,然后将它赋予具体的员工即可。这样即不用调整组织架构和对应的角色,也可以满足工作中特殊情况的权限需求。

    (4)黑白名单

      白名单:某些用户自身不拥有某部门的顶级角色,但处于业务需求,需要给他角色外的高级权限,那么我们可以设计限制范围的白名单,将需要的用户添加进去即可。

      在安全流程中,我们仅需要对白名单设计安全流程,即可审核在白名单中的特殊用户,做到监控拥有特殊权限的用户,减少安全隐患。

      黑名单:比较常见的黑名单场景是某些犯了错误的员工,虽然在职,但已经不能给他们任何公司权限了。这种既不能取消角色关联,也不能完全停用账号的情况,可以设置黑名单,让此类用户可以登录账号,查看基本信息,但大多数关键权限已经被黑名单限制。

 

  3)权限管理

    权限管理一般从三个方面来做限制。页面/菜单权限,操作权限,数据权限。

    (1)页面/菜单权限

      对于没有权限操作的用户,直接隐藏对应的页面入口或菜单选项。这种方法简单快捷直接,对于一些安全不太敏感的权限,使用这种方式非常高效。

    (2)操作权限

       操作权限通常是指对同一组数据,不同的用户是否可以增删改查。对某些用户来说是只读浏览数据,对某些用户来说是可编辑的数据。

    (3)数据权限

      对于安全需求高的权限管理,仅从前端限制隐藏菜单,隐藏编辑按钮是不够的,还需要在数接口上做限制。如果用户试图通过非法手段编辑不属于自己权限下的数据,服务器端会识别、记录并限制访问。

    (4) 数据权限如何管控

      数据权限可以分为行权限和列权限。行权限控制:看多少条数据。列权限控制:看一条数据的多少个字段

      简单系统中可以通过组织架构来管控行权限,按照角色来配置列权限,但是遇到复杂情况,组织架构是承载不了复杂行权限管控,角色也更不能承载列的特殊化展示。

      目前行业的做法是提供行列级数据权规则配置,把规则当成类似权限点配置赋予某个角色或者某个用户。

 

 

8. 用户管理系统权限设计中的更多实践细节

  1)超级管理员

    超级管理员是用来启动系统,配置系统的账号。这个账号应该在配置好系统,创建管理员之后被隐藏起来。超级管理员账号拥有系统中全部权限,可穿梭查看各部门数据,如果使用不恰当,是系统管理的安全隐患。

 

  2)互斥角色如何处理

     当用户已经有用的角色和即将添加的角色互相互斥时,应该在添加新角色时,提示管理员因角色互斥的原因,无法进行新角色添加。如需添加,要先撤销掉前一个角色,再添加新角色。

 

  3)用户管理权限系统设计一定要简单清晰

    在设计权限系统之处,一定要理清思路,一切从简,能不增加的多余角色和权限逻辑,就一定不要增加。因为随着公司业务的扩大,权限和角色也会随之增多,如果初期设计思路不严谨,那么权限系统会随着业务的扩大而无限混乱下去,此时再来整理权限,已经太晚了。所以初期设计就一定要条理清晰,简单明了,能避免后续非常多不必要的麻烦。

 

  4)无权提示页

     有时员工 A 会直接给员工 B 分享他当下正在操作的页面,但有可能员工 B 无权查看。此时我们应该在这里考虑添加「无权提示页」,避免粗暴的 404 页面让员工 B 以为是系统出错了。

 

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

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

相关文章

阿里云国际站代理商:FFmpeg 处理音视频文件的常用方法

阿里云代理商(聚搜云)专业服务于阿里云ECS服务器采购、阿里云Ddos采购、阿里云waf采购、对象存储OSS、阿里云企业邮箱采购、阿里云国际站代理商、阿里云国际站充值、云安全中心(态势感知)、阿里云高可用云数据库RDS、web应用云waf…

YOLO系列目标检测算法-Scaled-YOLOv4

YOLO系列目标检测算法目录 YOLO系列目标检测算法总结对比YOLOv1YOLOv2YOLOv3YOLOv4 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 本文总结: 提出一种网络缩放方法,使得基于CSP的YOLOv4可以上下伸缩,以适…

2019Linux系统教程189讲-08_基于LAMP架构部署商城系统

任务需求 1、任务具体要求 使用yum(dnf)工具一键部署LAMP环境 发布电商项目上线 ① 能够实现web界面注册会员账号 ② 能够实现web界面进行后台商品及会员的管理 2、项目选型 ㈠ PHPSHE商城系统概述 PHPSHE商城系统是将商品管理、品牌管理、规格管理、折扣管理、拼团管理、…

【Electron】常用小功能实现合集

一、前言 本篇主要介绍在electron项目开发过程中,一些实用小功能点的实现。比如设置开机自启动、只允许打开一个应用、设置electron项目基地为中文、获取当前的系统数据等等。 二、功能点 接下来咱们就逐一来说一说这些功能点是如何实现的。 1.设置应用开机自启…

MySQL索引结构B+树

数据结构图示例网站:Data Structure Visualization 索引数据结构: 二叉树 红黑树 Hash表 B-Tree B-Tree,特点:(每个节点都存储key和data,叶子节点指针为null) 1、叶节点具有相同的深度&#x…

y140.第八章 Servless和Knative从入门到精通 -- Serving及实践(四)

5.Serving及实践 5.1 Knative Serving工作模式 Serving的工作模式,上图从一个更大的全景图上了解Serving以及它与istio进行结合的时候它们的工作逻辑,Serving有4个关键组件,最关键的组件就是kservice,kservice本身会有两个非常重要的组件组成,一个叫做configuration也就是…

linux驱动_uart

linux uart驱动基础知识下面链接这篇文章写得很完备,我没必要再介绍了,就写目前项目的代码,方便以后重温。 Linux的tty架构及UART驱动详解 本项目驱动文件包括: /kernel/drivers/sstar/serial/ms_uart.c # 主要实现文件 /kerne…

HTML 头部

html 中 <head> 元素包含了所有的头部标签元素。在 <head> 元素中可以插入脚本(scripts)、样式文件(CSS)及各种 meta 信息。 一般来说&#xff0c;可以添加在头部区域的元素标签有&#xff1a;<title>、<style>、<meta>、<link>、<scri…

借助实例,轻松掌握 Makefile

实例1&#xff1a;hello world 编辑 Makefile all:echo "hello world"编译执行 $ make $ make all 结果输出 语法说明 echo 前面必须只有 TAB&#xff08;即你键盘上的 TAB键&#xff09;&#xff0c;且至少有一个 TAB&#xff0c;不能用空格代替。 实例2&#xff…

python相关知识的巩固-《python与量化投资从基础到实战》的python基础部分

python与量化投资从基础到实战数据格式numpypandasSciPy 插值 积分 优化 图像处理 特殊函数OLS 回归分析插值正态性检验凸优化matplotlib 绘图的始祖&#xff0c;适合绘制简单的统计图表。Seaborn 绘制美观的图表Scikit-Learn 机器学习常用的第三方模块决策树支持向量机朴素贝叶…

Flink SQL解析嵌套Json数据测试过程调研

一、背景 测试需求->流式计算->json嵌套类型数据&#xff0c;流式计算的流程是基于&#xff0c;将配置的任务&#xff0c;转化为flink sql&#xff0c;然后提交到集群上&#xff0c;执行计算任务的过程&#xff0c;所以&#xff0c;除基本功能测试以外&#xff0c;需要考…

前端单元测试---孤勇者级教程

《孤勇者》最近火爆的一塌糊涂&#xff0c;占领了小学生、甚至幼儿园&#xff0c;连我家2岁多的儿子尽然也会哼几句。虽然他以为这首歌是奥特曼的主题曲。 回到正题&#xff0c;现代前端项目的工程化、模板化日益壮大&#xff0c;各种类库框架层出不穷&#xff0c;整个行业俨然…

JavaScript日期库之date-fn.js

前言 用官网的话来说&#xff0c;date-fn.js 就是一个现代 JavaScript 日期实用程序库&#xff0c;date-fns 为在浏览器和 Node.js 中操作 JavaScript 日期提供了最全面、但最简单和一致的工具集。那实际用起来像它说的那么神奇呢&#xff0c;下面就一起来看看吧。 安装 安装的…

新的 WALLET 奖励倍数在 Ambire 上线,现在可以获得特殊福利!

Ambire 钱包奖励那些在以太坊上持续活跃的用户。 &#x1f4e3; 呼叫以太坊的铁杆粉丝&#xff01;我们专门为你们准备了最新的 $WALLET 奖励倍数来帮助你赚取更多的加密货币&#xff0c;前提是你已经保存好 Ambire 账户&#xff08;用于接收奖励&#xff09;。 听上去不错&…

Redis知识点总结-钊兵的笔记

简介 什么是Redis? redis是c语言开发的高性能的k-v形式的NoSQL型数据库&#xff0c;数据存储在内存中&#xff0c;诞生于意大利优点&#xff1a;存取速度快,官方称 读取速度会达到30万次每秒,写速度在10万次每秒,具体限制于硬件.缺点&#xff1a;对持久化支持不够良好,所以r…

flink的Standalone-HA模式安装

前言 本文使用flink1.14.5版本&#xff0c;介绍standalone-HA模式的安装。 此模式时高可用架构&#xff0c;采用zookeeper协调多个JobManager&#xff0c;保持每时每刻有一个运行中的JobManager,其余JobManager处理stand by状态。 因为涉及到运行过程中的状态数据的存储&…

2022年6月,海尔集团提前批算法岗面试题5道|含解析

问题1&#xff1a;介绍一下CE Loss公式 CE Loss就是交叉熵损失&#xff0c;损失函数公式如下&#xff1a; 二分类交叉熵 多分类交叉熵 问题2&#xff1a;介绍一下SVM算法 SVM算法就是支持向量机&#xff0c;是一种二分类模型&#xff0c;它的基本模型是定义在特征空间上的间…

Nginx越界读取缓存漏洞(CVE-2017-7529)

注意&#xff1a;仅用于技术讨论&#xff0c;切勿用于其他用途&#xff0c;一切后果与本人无关&#xff01;&#xff01;&#xff01; 理论知识 range The Range 是一个请求首部&#xff0c;告知服务器返回文件的哪一部分。在一个 Range 首部中&#xff0c;可以一次性请求多个…

[Python]多任务编程--线程

文章目录线程1. 线程的介绍2. 线程的概念3. 线程的作用多线程的使用1. 导入线程模块2. 线程类Thread参数说明3. 启动线程4. 获取当前线程5. 多线程完成多任务的代码6. 获取当前线程名线程执行带有参数的任务1. 线程执行带有参数的任务的介绍2. args参数的使用3. kwargs参数的使…

持续集成与自动化测试

持续集成与自动化测试 微服务化的基石——持续集成 某公司的主要业务是基础监控管理中台的建设。目前的项目还是采用单体模式&#xff0c;将所有功能打包在了一个包中&#xff0c;功能之间的耦合性高不容易进行拆分。未来的目标则是以微服务的架构来进行中台建设。 微服务架构…