权限系统是系统中链接用户与功能的关键桥梁,也是实际业务中组织角色及其职权的映射,不同的组织会需要不同的权限系统,但是作为SaaS我们需要考虑到灵活的配置、系统复杂度等综合情况。

权限情况是否能满足业务,是判断该系统价值度的一个重要标尺,如何在灵活与标准化、复杂度之间去平衡设计,就变得关键起来。

权限管理系统的设计中常遇到的问题有:

  • 配置不规范,系统基础不稳,拓展性差;

  • 配置不灵活,用户需求难满足,体验差;

  • 配置太灵活,逻辑会复杂,实施成本高;

目录

  • 基本要素

    • 主体
    • 客体
    • 行为
    • 机制
  • 设计
    • 用户
    • 角色
    • 角色组、角色层级
    • 客体
    • 行为
    • 组织
  • RESTFul接口设计与资源
  • 数据权限
    • 数据客体的控制范围

      • obj_metadata

基本要素

主体

发起行为的一方,通常为用户(也可能是系统或机器人,未来我们进入CIE、RPA领域时,这件事可能是系统本身便是主体)

  • 用户(组):用户代表一个系统使用者,用户组代表一组规则打包在一起的用户,目前系统我们可以将用户组用户租户隔离,即用户会先有组。
  • 角色(组):角色及角色组会直接与权限产生关系,而角色组用于打包角色使配置更便捷,短期可暂不引入该概念。
    角色分为:功能角色、职责角色、数据角色
    角色组:组织、角色层级
  • 标签(组):通过一些标签或标签组进行权限控制,可以作为灵活的补充
  • 其它:IP、设备类型、应用类型等

客体

行为的受体,内容的载体,一个主体操作的内容便是客体

  • 资源:数据(行,列 - 需要业务系统能支持)
  • 载体:菜单、页面、功能按钮、tab、推送消息
  • 操作资源的条件:审批节点(根据资源状态将资源分配给不同主体),所属权(个人、部门、部门及下属、全部等)

行为

增删改查下载上传审批,是不是简单粗暴?

机制

机制涉及到角色与权限之间的关系,包括继承、互斥、授权、双向认证、共享、范围控制、先决条件等

  • 继承:一个角色拥有其它一些角色的权限,如部门负责人的角色集成其部门所有角色,直接拥有该部门所有角色权限,也可通过角色组在这里使职责角色与功能角色不挂钩,但是常会有通过职责角色关联功能角色,使简化操作;
  • 互斥:拥有该角色的用户,不可拥有另一个或多个特定角色,可以将这几个角色打包为一个组,标记该组内角色互斥,或直接为角色配置与哪些角色互斥,采用何种方案视具体情况而定;
  • 授权:一个人可以将自己所具有的权限授予另一人,该授权范围不得大于授权人权限范围;
  • 双向认证:主体携带了角色权限信息,而客体也标识了具体的角色权限信息,双向认证通过后方可进行后续操作;
  • 共享:某用户可以将自己的角色权限共享给另一用户;
  • 范围控制:一般用于数据权限控制,常见的有 仅可见自己的数据、可见部门的数据、可见下属的数据等,与组织架构结合比较常见;
  • 先决条件:要获得某角色必须先获得另一个角色,通常为了严格控制会使要获得某上级角色,必须先获得其下级角色;

设计

用户

用户可以拥有:角色、角色组、组织

在较复杂组织中,我们可以将用户与角色组关联(见下一节角色组、角色层级、组织),角色组变相可以包含这个用户在组织内行使的所有职能,如财务部负责人,当用户获得该角色组时,便赋予了其组织架构角色以及其所对应的所有角色、权限,而当期岗位职责变更为HR负责人时,其失去财务部负责人这个角色组,获得HR负责人角色组,便直接实现了所有角色、权限的变更。

角色

角色是一组权限的组合,正如上一章提到,我们将角色再做细分为功能角色、数据角色、职责角色、其它角色(补充)

功能角色:我们最常见的角色,如菜单是否显示、某个按钮有没有、这个接口能否调用;

数据角色:定义一个角色对一组数据的访问权限,这会比功能权限控制复杂,因为必须要数据结构以及接口支持,如数据角色:自己门店指标任务数据,那么一个拥有该数据角色且属于该门店的用户,就能且只能查看其对应的门店指标任务数据,这需要指标任务数据暴露的接口能根据门店进行查询,接口识别到有数据权限控制时,校验数据权限,这里就有不止一种处理方式了,一种是接口定义查询我的门店任务,此时接口传参不带店铺ID,根据用户信息由系统自己查询店铺;还有一种是接口带店铺ID,此时识别到店铺ID为权限控制关键字段,便需要校验用户是否具有该店铺权限,没有便返回无对应权限;

职责角色:我们可以将职责角色集成多个功能角色、数据角色以及职责角色,并在命名上对业务友好,这会类似于角色组了;

角色组、角色层级

角色组:包含哪些角色;

角色层级:一个角色组其上级角色组与下级角色组;

组织架构:当角色层级形成时,其组织架构也就形成了,在角色层级之间我们需要去考虑是否有范围控制与先决条件;

NOTE:这里会涉及到角色权限以外的客体,如部门,部门是部门,是业务中实际存在的,而角色层级与组织架构某个角度是虚拟的,不要用实际的部门去强绑定这里提到的组织架构(当然也有单独维护组织架构而与角色权限无关的做法)。一个数据属于某个部门或多个部门,在数据权限上能否查看,即要看数据归属,也要看数据属性,但是外部访问都要通过接口调用,我们做系统的分层就使得我们的系统有了重新组织加工数据的能力,理论上数据怎么存是接口调用方不需要关注的。

客体

客体往往与前端息息相关,我们在做角色权限时,一定要考虑前端的集成实现,不然及时后端做了拦截,但是前端大开大合,或者修改起来代价很大,那么这也不是我们要的。

行为

基本操作:

审批流程:审批流程每一条都是一个独特的业务逻辑,其在业务节点中对于原有角色、权限、组织结构可能有关联也可能有特殊性,在这里我们一定不要用一套规则就绑死。

组织

组织是真实存在的部门及部门间的结构(扁平、层级等),不同的公司会有不同的组织架构设计,曾经看过一篇文章,叫100种组织架构设计,所以这个看似简单的东西,在不同的公司其实千差万别。

RESTFul接口设计与资源

角色与权限的设计指向的便是主体、客体、行为,而RESTFul的接口设计也是指向资源与操作行为的,某个角度两者能很好地契合,我们可以在管理平台(或统一权限中心维护数据),在网关缓存对应的客体与行为所需的权限,而登录用户请求时会携带主体信息,根据主体信息与接口控制匹配,实现对资源操作行为的控制。

数据权限

数据权限的控制会涉及到的客体便是数据,而对数据的权限控制,我们可以在两层来做:

  • 接口层
  • 数据访问层

当然这都需要我们对数据客体的设计,这里的设计还需要考虑不要因为权限控制而对原本的业务系统有大的影响,即有些业务数据的产生,不一定需要这么多的控制,或在数据产生及使用过程中,添加过多不必要的逻辑只会平白增加复杂度,没有必要。

但是数据也一定是有归属的,属于哪个组织哪个用户,如果没有这个归属信息,我们便无法知道该用户到底能不能基于范围操作数据。

标准数据体

GroupId

OrgId

Uid

data1

data2

dataxxx

creator

created

updated

归属租户ID 归属部门ID 归属用户ID 创建人 创建时间 更新时间

自定义数据体

标准数据体主要用于应对已相对固定的标准化数据,但是一套系统同样会面对一些新兴业务,如果我们采用一些低代码手段来实现这些业务,不会频繁新增新的库表来适配这些业务,因此我们需要系统能存在这些自定义数据体,而自定义数据体也需要进行数据权限的控制,因此我们该如何来设计这些自定义数据体呢?

GroupId

OrgId

UId

ObjId

key

value

归属租户ID 归属部门ID 归属用户ID

基于上面的考量,我们就在数据的上面增加一层保护网,让需要保护的通过该保护网,不需要保护的直接通过即可。

数据客体的控制范围

  • 数据对象(这个数据我能不能看)
  • 数据行(只能看我自己的,还是能看部门的,还是能看所有的)
  • 数据列(能看到销售额,但是不能看成本)

最理想的情况当然是自由的组合,但是所有自由组合的背后都会有代价与复杂度。

我们的设计关键是数据数据权限中,该角色能访问哪些数据,因此会有一个数据资产的维护记录,比如我们称其为obj_metadata,数据资产便在这里进行管理,权限与数据资产的关系便基于此去建立。

obj_metadata

GroupId

ObjId

Col

关于几张表:

  1. 用户
  2. 用户与用户组
  3. 角色
  4. 角色组及角色层级(含相互关系)
  5. 用户与角色关系
  6. 用户与角色组关系
  7. 权限
  8. 角色与权限关系
  9. 权限间关系

审批流:

  1. 审批流通常与用户及用户组相关,具体视业务而定,但是经典的审批流系统中基本是基于此。

SaaS系统权限体系设计相关推荐

  1. SpringCloud微服务架构实战:商家权限体系设计及开发

    商家管理后台与sso设计 在本文的电商平台实例中,商家是这个平台的主角,商家管理后台是专门为这个主角提供的一个安全可靠的操作平台.在商家管理后台中,商家可以进行商品管理.订单管理.物流管理.会员管理. ...

  2. 嵌入式系统硬件体系设计(一)

    目录 嵌入式系统硬件体系设计概论 1.1嵌入式系统及硬件体系概述 1.1.1嵌入式系统概论 1.1.2嵌入式系统的构成 1.2 嵌入式硬件体系的基本构成 1.3硬件体系设计的相关内容简介 嵌入式系统硬 ...

  3. 基于RBAC 的SAAS系统权限设计

    为什么系统需要权限控制? 生活中有没有权限限制? 灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临: 屌丝身边为什么没有那些长得漂亮.身材好的姑娘存在? 因 ...

  4. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)

    权限设计(转:http://blog.csdn.net/chexlong/article/details/37697555)      1. 前言:      权限管理往往是一个极其复杂的问题,但也可 ...

  5. 系统权限管理设计 (转)

    权限设计(初稿)      1. 前言:      权限管理往往是一个极其复杂的问题,但也可简单表述为这样的逻辑表达式:判断"Who对What(Which)进行How的操作"的逻辑 ...

  6. rbac模型的特点和优势_权限体系设计:融合了组织和岗位的权限模型长啥样?...

    文章从RBAC的基本原理出发,结合案例对权限设计中一个职位对应多个岗位的的情况进行了说明,并分享了相关权限模型,供大家一起参考和学习. 传统RBAC与现实的距离 传统的RBAC(基于角色的访问权限控制 ...

  7. 多租户 Saas 系统架构的设计思路

    ToB Saas 系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显 ...

  8. 电商平台-RBAC系统权限的设计与架构

    说明:根据上面的需求描述以及对需求的分析,我们得知通常的一个中小型系统对于权限系统所需实现的功能以及非功能性的需求,在下面我们将根据需求从技术角度上分析实现的策略以及基于目前两种比较流行的权限设计思想 ...

  9. 系统权限控制设计001---RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

最新文章

  1. 如何把一段简单的代码变复杂?
  2. LeetCode Pascal's Triangle
  3. php扩展mongodb模块安装
  4. 使用mpvue和wepy开发小程序
  5. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场
  6. 启明云端分享| 彩屏化的86控制面板(简称86盒)怎么选型硬件和对比
  7. c语言调用createthread线程的头文件_易语言API多线程总汇
  8. Java讲课笔记23:Map接口及其实现类
  9. 【转载】二分图最大匹配的König定理及其证明 Matrix67原创
  10. [每日一题] 11gOCP 1z0-053 :2013-10-1 persistent lightweight jobs...........................11
  11. java从入门到精通pdf第五版,满满干货指导
  12. AndroidStudio 抓包工具Profiler使用
  13. 解决智慧树考试酷无法复制粘粘的问题
  14. winxp关闭系统音频服务器,xp系统显示没有音频设备怎么办 xp系统音频驱动异常或者未安装如何解决...
  15. countif函数比较两列不同_Excel如何对比两列姓名找出两列相同和不同的姓名有哪些方法...
  16. 华硕fl5600l重装系统
  17. vue——router更改路由地址,但是页面不能跳转
  18. “心脏滴血”漏洞复现
  19. layUI自定义列表每页条数
  20. 新年新气象 每天一个好心情

热门文章

  1. OB0202 obsidian kanban插件使用
  2. 微软2016校园招聘4月在线笔试2-403 Forbidden
  3. phpqrcode简单在线二维码生成工具源码 非第三方接口
  4. ibm的主要竞争对手_IBM如何计划在云中竞争
  5. AntV G2 Tooltip
  6. 中国语言地图集 c1-12,中国语言地图集介绍——网上收集整理
  7. Method_Confusion_Attack_on_Bluetooth_Pairing
  8. VMware WorKstation虚拟机上 Linux 6最小化安装和基本网络环境配置
  9. 电脑回收站清空了能恢复吗?
  10. linux 端口不通,linux的端口不通怎么解决