此篇主要对权限系统设计所涉的一些专业术语重点梳理。从我们windows的文件系统 自主访问控制 到基于角色访问控制。

权限设计基本术语

对后面会用到的词汇做一个简要说明

什么是权限(许可)

权限(Privilege/Permission)是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度。它常常用“具有批准……事项的权限”来进行表达。例如,具有批准预算外5000元以内的礼品费支出的权限。

在计算机系统中,权限是指某个特定的用户具有特定的系统资源使用权力。而在我们做的后台管理系统,资源指的是系统中所有的内容,包括模块、菜单、页面、字段、操作功能(增删改查)等等。大致可以将权限分为:

  1. 功能级权限管理,在操作系统中的任何动作、交互都是功能权限,如增删改查等。

  2. 数据级权限管理。一般业务管理系统,都有数据私密性的要求:哪些人可以看到哪些数据,不可以看到哪些数据。

从控制方向来看,也可以将权限管理分为两大类:

  1. 从系统获取数据,比如查询订单、查询客户资料

  2. 向系统提交数据,比如删除订单、修改客户资料

权限管理

权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源

权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 很多人常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。

功能权限管理技术,一般就使用基于角色访问控制技术RBAC(Role Based Access Control)。该技术被广泛运用于各个系统。

权限控制表 (ACL: Access Control List)

用来描述权限规则或用户和权限之间关系的数据表。

权限标识

权限的代号,例如用“ARTICLE_ADD”来指代“添加文章的操作”权限。如linux文件浅析 rwx代表读写执行权限。

角色

角色是一定数量的许可的集合,许可的载体,一个角色可以包含多个用户,一个用户同样的也可以属于多个角色,所以角色与用户的关系为多对多的关系。同样的一个角色可以包含多个用户组,一个用户组也可以属于多个角色,所以角色和用户组也是多对多的关系;

一个用户一个角色:用户/角色/权限关系总结

  • 个用户有一个角色

  • 一个角色有多个操作(菜单)权限

  • 一个操作权限可以属于多个角色

在实际的团体业务中,都可以将用户分类。比如对于薪水管理系统,通常按照级别分类:经理、高级工程师、中级工程师、初级工程师。也就是按照一定的角色分类,通常具有同一角色的用户具有相同的权限。这样改变之后,就可以将针对用户赋权转换为针对角色赋权。

我们可以用下图中的数据库设计模型,描述这样的关系。

一个用户一个或多个角色:用户/角色/权限关系总结

但是在实际的应用系统中,一个用户一个角色远远满足不了需求。如果我们希望一个用户既担任销售角色、又暂时担任副总角色。该怎么做呢?为了增加系统设计的适用性,我们通常设计:

  • 一个用户有一个或多个角色

  • 一个角色包含多个用户

  • 一个角色有多种权限

  • 一个权限属于多个角色

我们可以用下图中的数据库设计模型,描述这样的关系。

用户组

当平台用户基数增大,角色类型增多时,如果直接给用户配角色,管理员的工作量就会很大。如果有一类的用户都要属于某个角色,我们一个个给用户授予角色,重复工作特别多,所以我们把这么一些用户进行分类,这时候我们可以引入一个概念“用户组”,就是将相同属性的用户归类到一起。也就是用户组,这样的话,我们直接对用户组赋予角色,减少重复的工作量。

例如:加入用户组的概念后,可以将部门看做一个用户组,再给这个部门直接赋予角色(1万员工部门可能就几十个),使部门拥有部门权限,这样这个部门的所有用户都有了部门权限,而不需要为每一个用户再单独指定角色,极大的减少了分配权限的工作量。

同时,也可以为特定的用户指定角色,这样用户除了拥有所属用户组的所有权限外,还拥有自身特定的权限。

用户组的优点,除了减少工作量,还有更便于理解、增加多级管理关系等。如:我们在进行组织机构配置的时候,除了加入部门,还可以加入科室、岗位等层级,来为用户组内部成员的权限进行等级111111上的区分。

关于用户组的详细疑难解答,请查看https://wen.woshipm.com/question/detail/88fues.html。在这里也十分感谢为我解答疑惑的朋友们!

常见设计模式

自主访问控制(DAC: Discretionary Access Control)

系统会识别用户,然后根据被操作对象(Subject)的权限控制列表(ACL: Access Control List)或者权限控制矩阵(ACL: Access Control Matrix)的信息来决定用户的是否能对其进行哪些操作,例如读取或修改。

而拥有对象权限的用户,又可以将该对象的权限分配给其他用户,所以称之为“自主(Discretionary)”控制。

这种设计最常见的应用就是文件系统的权限设计,如微软的NTFS。

DAC最大缺陷就是对权限控制比较分散,不便于管理,比如无法简单地将一组文件设置统一的权限开放给指定的一群用户

强制访问控制(MAC: Mandatory Access Control)

MAC是为了弥补DAC权限控制过于分散的问题而诞生的。

在MAC的设计中,每一个对象都都有一些权限标识,每个用户同样也会有一些权限标识,而用户能否对该对象进行操作取决于双方的权限标识的关系,这个限制判断通常是由系统硬性限制的。比如在影视作品中我们经常能看到特工在查询机密文件时,屏幕提示需要“无法访问,需要一级安全许可”,这个例子中,文件上就有“一级安全许可”的权限标识,而用户并不具有。

MAC非常适合机密机构或者其他等级观念强烈的行业,但对于类似商业服务系统,则因为不够灵活而不能适用。

因为DAC和MAC的诸多限制,于是诞生了RBAC,并且成为了迄今为止最为普及的权限设计模型。

RBAC是什么?

RBAC,Role-based access control基于角色的访问控制,通过角色关联用户,角色关联权限的方式间接赋予用户权限。

是资讯安全领域中,一种较新且广为使用的访问控制机制,其不同于强制访问控制以及自由选定访问控制直接赋予使用者权限,而是将权限赋予角色。

1996年,莱威·桑度(Ravi Sandhu)等人在前人的理论基础上,提出以角色为基础的访问控制模型,故该模型又被称为RBAC96。之后,美国国家标准局重新定义了以角色为基础的访问控制模型,并将之纳为一种标准,称之为NIST RBAC。

RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What(Which)进行How的操作,也就是“主体”对“客体”的操作,其中who——是权限的拥有者或主体(如:User、Role),what——是资源或对象(Resource、Class)

为什么选择RBAC进行权限控制

通常一个系统会存在不同权限的用户,而根据业务要求的不同,每个用户能使用的功能、查看的内容是不同的。举个最简单的例子:钉钉后台,普通员工和行政能看到的菜单、使用的功能是不同的,行政可以查看所有员工的出勤记录而普通员工则不行。

其实是可以直接给用户分配权限,只是直接给用户分配权限,少了一层关系,扩展性弱了许多,适合那些用户数量、角色类型少的平台。

对于通常的系统,比如:存在多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。有了角色后,我们只需要为该角色制定好权限后,将相同权限的用户都指定为同一个角色即可,便于权限管理。

对于批量的用户权限调整,只需调整用户关联的角色权限,无需对每一个用户都进行权限调整,既大幅提升权限调整的效率,又降低了漏调权限的概率。

RBAC定义

在一个组织中,会因为不同的作业功能产生不同的角色,执行某项操作的权限会被赋予特定的角色。组织成员或者工作人员(抑或其它系统用户)则被赋予不同的角色,这些用户通过被赋予角色来取得执行某项计算机系统功能的权限。

  • S = 主体 = 一名使用者或自动代理人

  • R = 角色 = 被定义为一个授权等级的工作职位或职称

  • P = 权限 = 一种存取资源的方式

  • SE = 会期 = S,R或P之间的映射关系

  • SA = 主体指派

  • PA = 权限指派

  • RH = 角色阶层。能被表示为:≥(x ≥ y 代表 x 继承 y 的权限)

  • 一个主体可对应多个角色。

  • 一个角色可对应多个主体。

  • 一个角色可拥有多个权限。

  • 一种权限可被分配给许多个角色。

  • 一个角色可以有专属于自己的权限。

所以,用集合论的符号:

  • PA⊆P×R 是一个多对多的权限分配方式。

  • SA⊆S×R 是一个多对多的主体指派方式。

  • RH⊆R×R

参考文章:

RBAC模型:基于用户-角色-权限控制的一些思考 www.woshipm.com/pd/1150093.html/comment-page-1

RBAC权限模型——项目实战 https://blog.csdn.net/zwk626542417/article/details/46726491

权限系统设计模型分析(DAC,MAC,RBAC,ABAC) https://www.jianshu.com/p/ce0944b4a903

图文详解基于角色的权限控制模型RBAC https://www.bbsmax.com/A/kvJ3Yl8Ddg/

转载本站文章《权限系统设计(0):权限系统设计基本概念改需-MAC/RBAC引子》,
请注明出处:https://www.zhoulujun.cn/html/Operation/PM/2020_0505_8401.html

权限系统设计(0):权限系统设计基本概念改需-MAC/RBAC引子的更多相关文章

  1. Android M(6.0) 权限相关

    原文链接:http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ Android M 新的运行时权限开发者需要知道的一切   an ...

  2. Android教程 -05 Android6.0权限的管理

    视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 上篇文章我们讲解了通过隐式意图拨打电话,在AndroidManifest.xml文件中添加了权限 <uses-permis ...

  3. Android 6.0权限全面详细分析和解决方案

    原文: http://www.2cto.com/kf/201512/455888.html http://blog.csdn.net/yangqingqo/article/details/483711 ...

  4. Android开发——Android 6.0权限管理机制详解

    .Android 6.0运行时主动请求权限 3.1  检测和申请权限 下面的例子介绍上面列出的读写SD卡的使用例子,可以使用以下的方式解决: public boolean isGrantExterna ...

  5. Android6.0权限管理以及使用权限该注意的地方

    Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...

  6. Android 6.0 扫描不到 Ble 设备需开启位置权限

    Android 6.0 扫描不到 Ble 设备需开启位置权限 之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试的,今天使用 Android 6.0 的设备测试的时候,发现扫 ...

  7. Android 6.0 权限知识学习笔记

    最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...

  8. Android 6.0 权限申请辅助 ----PermissionsHelper

    Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...

  9. ## Android 6.0 权限申请 ##

    Android 6.0 权限申请 1. 以前的权限申请(sdk<23) 直接在AndroidManifest.xml中申明即可: <uses-permission android:name ...

随机推荐

  1. vue打包 报错问题记录

    1.  assetsPublicPath: '/' 修改为 assetsPublicPath: './'   2. untils.js里面增加   publicPath: '../../'  重新运行 ...

  2. 流复制-pg_basebackup (有自定义表空间)

    一.组成部分 1.walsender进程是用来发送WAL日志记录的 2.walreceiver进程是用来接收WAL日志记录的 3.startup进程是用来apply日志的 二.主库配置 1.授权账号, ...

  3. 王艳 201771010127《面向对象程序设计(java)》第八周学习总结

    一:理论部分. 1.接口:Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多接口.(接口不是类,而是对类的一组需求描述,它由常量和一组抽象方法组成) 1)通常,接口名称以able ...

  4. C语言基础知识(五)——数组与指针的等价表示

    void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...

  5. 第二篇-用Flutter手撸一个抖音国内版,看看有多炫

    前言 继上一篇使用Flutter开发的抖音国际版 后再次撸一个国内版抖音,大部分功能已完成,主要是Flutter开发APP速度很爽,  先看下图 项目主要结构介绍 这次主要的改动在api.dart 及 ...

  6. 【Python】利用python自动发送邮件

    前言 在训练网络的过程中,需要大量的时间,虽然可以预估网络训练完成时间,但蹲点看结果着实有点不太聪明的亚子. 因此,参照师兄之前发的python利用smtp自动发邮件的代码,我作了些调整,并参照网上的 ...

  7. Java——动态生成POJO类

    package com.java.test.dynamicpojo; import java.io.ByteArrayOutputStream; import java.io.IOException; ...

  8. Robot Framework(2)- 快速安装

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 安装RF cmd ...

  9. (五)Ajax修改购物车单品数量

    需要gson-2.2.4.jar BookServlet.java package com.aff.bookstore.servlet; import java.io.IOException; imp ...

  10. dubbo报com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2020-03-28 23:08:50.342, end time: 2020-03-28 23:08:51.344,

    当进行debug 启动项目报 dubbo remotiong timeout ,默认1一秒,要在spring配置文件中,dubbo配置中dubbo:service配置timeout属性,如下图配置10 ...