当前位置: 首页 > news >正文

设计模式——RBAC 模型详解

1.什么是 RBAC 呢?

RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。

简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系。如下图:

2.RBAC的组成

在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。

RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理:

  • User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
  • Role(角色):不同角色具有不同的权限
  • Permission(权限):访问权限
  • 用户-角色映射:用户和角色之间的映射关系
  • 角色-权限映射:角色和权限之间的映射


它们之间的关系如下图所示:

3.RBAC的优缺点

(1)优点

  • 简化了用户和权限的关系
  • 易扩展、易维护

(2)缺点:

  • RBAC模型没有提供操作顺序的控制机制,这一缺陷使得RBAC模型很难适应哪些对操作次序有严格要求的系统

 4.RBAC的3种模型

(1)RBAC0

RBAC0,是最简单、最原始的实现方式,也是其他RBAC模型的基础

在该模型中,用户和角色之间可以是多对多的关系,即一个用户在不同场景下是可以有不同的角色,例如:项目经理也可能是组长也可能是架构师。同时每个角色都至少有一个权限。这种模型下,用户和权限被分离独立开来,使得权限的授权认证更加灵活

(2)RBAC1

基于RBAC0模型,引入了角色间的继承关系,即角色上有了上下级的区别。


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

这种模型适合于角色之间层次分明,可以给角色分组分层。

(3)RBAC2

RBAC2,基于RBAC0模型的基础上,进行了角色的访问控制

RBAC2中的一个基本限制是互斥角色的限制,互斥角色是指各自权限可以互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。

该模型有以下几种约束:

  • 互斥角色 :同一用户只能分配到一组互斥角色集合中至多一个角色,支持责任分离的原则。互斥角色是指各自权限互相制约的两个角色。对于这类角色一个用户在某一次活动中只能被分配其中的一个角色,不能同时获得两个角色的使用权。常举的例子:在审计活动中,一个角色不能同时被指派给会计角色和审计员角色。
  • 基数约束 :一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限;同样一个角色对应的访问权限数目也应受限,以控制高级权限在系统中的分配。例如公司的领导人有限的;
  • 先决条件角色 :可以分配角色给用户仅当该用户已经是另一角色的成员;对应的可以分配访问权限给角色,仅当该角色已经拥有另一种访问权限。指要想获得较高的权限,要首先拥有低一级的权限。就像我们生活中,国家主席是从副主席中选举的一样。
  • 运行时互斥 :例如,允许一个用户具有两个角色的成员资格,但在运行中不可同时激活这两个角色。
     

相关文章:

  • vue 使用vuex中的data数据引用问题
  • Type Hints in Python:python的类型注释
  • VIVADO 擦除flash
  • 在Linux本地部署开源自托管导航页配置服务Dashy并远程访问
  • 计算机组成原理-Cache替换算法
  • 【华为OD题库-048】拔河比赛-java
  • Docker+ Jenkins+Maven+git自动化部署
  • 每日一题:LeetCode-283. 移动零
  • 在Django中使用Q对象和条件运算符来构建动态查询
  • DDoS高防IP到底是什么?
  • C# 友元程序集
  • 225. 用队列实现栈 --力扣 --JAVA
  • linux下实现Qt程序实现开机自启动
  • LeetCode [简单](非递归)二叉树的中序遍历
  • Python爬虫遇到重定向URL问题时如何解决?
  • 0基础学习移动端适配
  • Create React App 使用
  • dva中组件的懒加载
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python十分钟制作属于你自己的个性logo
  • SQL 难点解决:记录的引用
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 后端_ThinkPHP5
  • 基于webpack 的 vue 多页架构
  • 技术发展面试
  • 将 Measurements 和 Units 应用到物理学
  • 聊聊flink的TableFactory
  • 模型微调
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据结构java版之冒泡排序及优化
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 怎么将电脑中的声音录制成WAV格式
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 飞书APP集成平台-数字化落地
  • #include<初见C语言之指针(5)>
  • #图像处理
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net Application的目录
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 依赖注入的基本用发
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @Autowired注解的实现原理
  • @Query中countQuery的介绍
  • []C/C++读取串口接收到的数据程序