最好的权限设计,是先区分功能权限和数据权限

44 评论 116835 浏览 509 收藏 16 分钟

本文为我们介绍了功能权限和数据权限的不同点、以及不同部分中的要点与注意事项。

做2B的系统总是不可回避的遇上权限问题,他不是核心业务却又必不可少,而且总是牵一发而动全身,更要命的是不同客户组织架构完全不同,功能复用性很低。有没有什么方法论能快速理清权限问题呢?

我们一般说【权限】的时候是在说功能权限和数据权限。功能权限指用户登录系统后能看到什么模块,能看到哪些页面,而数据权限指的是用户在某个模块里能看到几条数据,能看到哪些数据。以下分别描述一下我对功能权限和数据权限的理解。

功能权限

在企业系统中,通过配置用户的功能权限可以解决不同的人分管不同业务的需求,但是如何实现快速配置?功能的粒度是模块级的还是页面级的还是更细粒度的?跨模块操作时没权限怎么办?

图1-1

RBAC模型

说到功能权限不得不说RBAC(Role Based Access Control)模型,它的中文是基于角色的访问控制,主要是将功能组合成角色,再将角色分配给用户,也就是说角色是功能的合集。RBAC有多个成员,但是基础的RBAC0就足够我们涉及的系统使用了。(如果想了解更多,请点击RBAC权限管理总结

为什么要引入这个模型呢?请看以下的例子:

企业A一共有12个功能,需要创建100个用户,这些用户中有管财务的、有管人事的、有管销售的等等。如果不引入RBAC模型,我们需要每创建一个用户就要分配一次功能,至少(每个用户只有一个功能)操作100次,如果人数增加到1000甚至10000,并且一个用户可能会有多个功能的时候,操作会非常繁琐,如图:

图1-2

经过多次操作发现:分配给某些人的功能都是相同的,比如分配给A、B等10个用户的功能都是客户管理、订单管理及供应商管理这几个模块,那是不是可以把这几个功能模块打成一个包整体分给需要的用户呢?

这个包就叫做角色。由于角色和功能的对应关系相对固定,给用户分配权限的时候只分配角色即可。

图1-3

所以引入RBAC模型的意义在于:

  1. 解耦用户和功能,降低操作错误率;
  2. 降低功能权限分配的繁琐程度。

图1-4 图中一个用户对应一个角色,但实际场景中也可以是一个用户对应多个角色

有些更复杂的系统可能会涉及RBAC家族的其他成员:RBAC1、RBAC3、RBAC97等,并逐渐看到【用户组】、【角色继承】、【受限角色】等概念,但模型的引入只是多了依据和调理,复杂度并不会因为模型的增多而快速降低,模型引入带来的边际效用只会越来越低。

更多角色问题请参考:角色权限设计的100种解法

功能的粒度

功能越多,操作越繁琐,复杂度越高,所以选择合适的功能粒度才能快速理清权限问题,也能帮助用户提升工作效率。

功能的粒度从粗到细一般分为:模块级->页面级->接口级(接口级的功能权限指的是哪个角色能调用哪些接口)。

从后台角度:为了系统安全,代码肯定都会实现到接口级。那我们做粒度选择的意义是什么?当然是为用户降本增效。只是粒度越粗,用户操作越简单,灵活性却越低。

非技术类的网站做到模块级就够了,否则用户体验会让人欲哭无泪。对比以下两张图感受一下:

图1-5

功能的优先级

如果权限必须细化到页面甚至接口级别应该要遵循一个优先级规律,即只要分配低优先级的功能必须先分配高优先级的功能,否则会出现有删除权限却找不到操作位置的尴尬情况(删除按钮在列表页面,却没有分配查看列表页面的权限)。具体做法可以通过交互的方式解决,比如检测到勾选低优先级的功能就自动帮助勾选高优先级的,或者通过提示性的文字帮助用户组合勾选。

需要说明的是不同的交互设计会导致优先级不一样,因为有的按钮会放在列表,有的按钮只放在详情页。我们常用的优先级顺序是查看详情>查看列表>增加、删除、编辑、其他操作按钮。

跨模块访问的问题

有一个功能权限是模块级的系统,其中模块A的页面有访问模块B某个页面的链接,那么只有模块A权限的用户可以点击链接进入模块B吗?

这个问题有两种解法:

1. 允许只有模块A权限的人通过链接访问模块B

这说明系统有一条隐含的规则:能看到链接就表示用户由模块A和模块B的某些页面的功能权限。后台需要给所有【有模块A权限】的用户【自动分配】访问模块B某个页面的权限。

2. 只有既有模块A权限也有模块B权限的用户才可以通过链接进行访问

这说明这个链接就是给同时拥有两个模块权限的用户设计的。即只有模块A权限的用户不能通过链接访问模块B。

这儿就需要根据真实业务替用户选择一种方式,但不管那种方式都可以通过交互和预定义的方式让操作更简便,比如如果选择第1种解法,那么初始化一个有A模块权限和B模块某个页面的角色,让用户随时可以选择。

数据权限

如果所有信息都是公开透明的,也就不需要做数据权限的控制。可现实世界如此复杂,每个人需要看到的、应该看到的数据永远不同,数据权限便应这些需要和规则而生。

数据权限解决的是用户能看到多少数据量和什么数据的问题,例如A和B两个用户都能看到销售模块,但A能看到320条数据,B只能看到100条数据,且A能看到的320条数据中包含着B能看到的100条数据,这些都是由数据权限决定的。

数据权限和什么有关?

数据权限一般和企业的组织架构相关,而组织架构分为树状和扁平状的(还有更复杂组织架构,此处暂不做说明)

图2-1 树状组织架构,每个部门都是一个结点

图2-2 扁平状组织架构

因为扁平状组织架构较为简单,需要注意的问题已经隐含在树状架构中,所以以下主要讲树状架构。

层级数量

不同的企业层级深度不同,如果系统支持无限层级,那好处是通用,坏处是带来了数据的复杂性和视觉实现的复杂性,所以也要具体问题具体分析。

结点间的数据共享方式

图2-3
因为用户具有的权限是功能权限和数据权限交叉定义的,所以此处假设G、A、B部门的用户都被赋予了用户管理和资产管理的功能权限

目前结点间的数据共享方式有几类:

  • 父结点可以管理所有子结点的数据:用户G可以【管理】部门A、部门B的所有用户和所有资产。
  • 子结点可以管理父结点的数据:用户A1可以【管理】部门G的所有用户和所有资产。
  • 兄弟结点之间可以互相管理:用户A1可以【管理】部门B的所有用户和所有资产。
  • 结点只能管理自己所在结点的数据:用户A1只能【管理】部门A的所有用户和所有资产。
  • 结点里的用户只能看到自己的数据:用户A1只能【管理】用户A1自己创建的用户和资产。

实际业务系统进行数据权限的定义时:

a. 选择以上一种或几种规则;

b. 根据业务而定定义以上的【管理】:增、删、改、查及各种小功能的组合。

比如如果选择父结点只能【查看而不能编辑、删除、新增】子结点的所有数据,那么图中用户G只能查看部门A的所有数据而不能对其进行编辑、删除和新增。

结点里的用户存在上下级关系怎么办?

图2-4  和图2-3一样

如果实际业务中用户A1是用户A2的上级,并要求用户A1能看用户A2的数据,而用户A2不能看用户A1的数据怎么办?

如果数据权限只规定到结点级(组织级),那么用户A1和用户A2看到的数据都是一样的。所以需要再次引入功能权限的【角色】解决人员上下级问题。

例如,如图2-4,系统选择的结点间的数据共享方式是:结点只能增删改查自己所在结点的数据,另外引入角色规则:管理员可以增删改查所在结点所有数据,非管理员只能删改查自己创建的数据。那么如果用户A1的角色是管理员,A2是非管理员,A1就能增删改查A部门所有资产,A2只能增删改查自己创建的资产。

扁平架构

扁平化的组织架构比较简单,只存在树状架构中的第3个问题。请参考树状架构的第3个问题。

功能权限和数据权限的碰撞:跨模块的数据【使用】问题

假设某系统一共有两个模块:型号管理和设备管理,操作系统的流程是先创建型号再创建设备,如果一个用户只有设备管理而没有型号管理的权限,在创建设备时是否可以选型号?

图2-5

这其实是一个功能权限(接口级)和数据权限融合的问题,即用户创建设备的时候是否有请求型号列表接口的权限?列表中要展示哪些数据?

从功能权限讲:用户肯定有请求接口列表的权限,否则流程就无法走通了。

从数据权限讲:有几种规则作为参考,具体根据实际业务进行选择:

  1. 不管哪个层级或者谁创建的型号都在接口中展示(即型号数据在别的模块使用时全局可见);
  2. 只展示当前登录用户所属结点创建的型号;
  3. 只展示当前登录用户所属结点及下属节点创建的型号(扁平化组织架构不适用);
  4. 只展示当前登录用户所属结点的父结点创建的型号(扁平化组织架构不适用);
  5. 只展示当前登录用户所属结点的兄弟结点创建的型号(扁平化组织架构不适用);
  6. 只展示当前登录用户创建的型号。

总结

  1. 建设toB的系统时要考虑两种权限:功能权限和数据权限。
  2. 功能权限可以参考RBAC模型,通过引入角色、用户组等概念降低复杂度。但系统用户数量庞大,功能极度复杂且粒度足够细时,复杂度已不可避免,只需考虑是把复杂交给用户、运维还是代码。
  3. 数据权限主要和组织架构有关,组织架构中树状架构较为复杂,需要统一或者分模块的定义层级间数据共享问题。数据权限定义过程中如果出现同一结点下的【用户间层级问题(上下级)】需要回到功能权限的【角色定义】去解决。
  4. 有一类跨模块【使用数据】的问题也可以看成既定的接口权限和可选的数据权限问题。

总之扬帆在角色权限的海洋里绕啊绕啊绕,总会绕出几个原则,走出几个理论让我们绕的更快,徜徉的更有成就感。

 

本文由 @娜娜 原创发布于人人都是产品经理,未经许可,禁止转载。

题图来自Unsplash,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 除了组织架构划分出的权限之外,建议补充业务数据的访问权限,比如当分配新建/查看/编辑 权限的时候,可以新建/查看/编辑 哪些数据

    来自河北 回复
  2. 您好!请问跨模块的数据【使用】问题中,我理解的是该有用具有型号管理的数据权限,但没有型号管理的功能权限对吗?

    来自北京 回复
    1. 是的

      来自北京 回复
  3. 数据权限和操作权限混一起,最终能把自己搞晕。一看就是纸上谈兵的理想主义。

    来自广东 回复
    1. 😂

      来自北京 回复
    2. 操作权限就是按钮,数据权限很好理解,比如常见的上级可以看到下级的数据,那么你登录的时候,将下级的权限+自己的权限都查询出来即可,这样就能实现数据权限,数据权限是伪命题,一定会结合具体业务。

      来自江苏 回复
  4. 功能优先级那块,为什么查看详情要大于查看列表,不是先到列表才能看各种数据和功能吗,查看详情的按钮是挂着列表的操作列的

    来自广西 回复
    1. 有道理

      来自江苏 回复
    2. 作者说的意思是:比如你配置好了一个低优先级的“添加”按钮,此时更高优先级的“列表查看”和“详情页”就必须默认勾选上。

      来自天津 回复
  5. 自己创建的自己能看到,如果仅有查看权限,没有新增,是查看全部还是部分

    来自江苏 回复
  6. 一个部门下有多个人, 多个子部门 ;
    一个领导管理多个部门 ;
    这个领导需要看到的数据为所管理部门下的数据 ;

    语言描述很简单, 如何实现呢, 这种 SQL 查询逻辑 数据量一多 效率一定非常低

    来自四川 回复
  7. 统一数据权限和功能权限独立的说法,如果是简单的数据权限的确可以和功能权限一起合到角色中,但更多的业务场景需要单独维护,这里就要看是落到人,岗位还是组织上去管理是最合适的问题了,最终都是落到人。

    来自山东 回复
    1. 是的

      来自广东 回复
  8. 请问一下,数据权限是在功能权限的基础上建立的吗?就是用户A拥有【员工管理】整个功能模块权限,用户A的数据权限设置为可查看本部门数据,那么用户A的部门数据权限是不是【员工管理】模块的所有数据?

    来自广东 回复
    1. 数据权限是在功能权限的基础上的,员工A可以在员工管理中看到本部门的所有员工信息,其他部门的就看不到了哦~

      来自北京 回复
  9. 同一组织节点下的上下级数据显示问题用岗位去区分就好了

    来自广东 回复
  10. 还有一个,我如何把这些功能权限的划分还有数据权限的划分体现到我的一个说明里,可以让别人看到,并知道。还有一个我是否可以把他们理解为一种是你有哪些功能权限,一种是你再哪个定义域使用的概念,但感觉这样说也不对,他们呢并不是一个东西的两层约束,而是两个不同的范畴。你总结的第三点我觉得很好,之前也做可见范围这样的单独管理,可是弄的弄的就又回到了角色权限的匹配上,

    来自山东 回复
    1. 我觉得最好的方式是在文档上就区分开两种权限去说明,各说各的。但在最后需要声明,数据权限是建立在功能权限上说的。比如一个人没有某个模块的功能权限却讨论他的数据权限是没有意义的。

      回复
    2. 了解

      来自广东 回复
  11. 在功能颗粒度这里,页面级的颗粒度是什么意思呢?

    来自山东 回复
    1. 哪个角色能看到那个页面,不能看到哪个页面,从前端的视角看,系统是由一个个页面组成的。

      回复
  12. 你好娜娜,举手提问下哈。
    文中提到了在权限管理的设计中,会碰到功能权限和数据权限融合的情况,比如我管理作为超管对一个设备管理员的权限进行管理,我把新增设备的功能权限配给他,此时他要看到设备来新增,此时我的需求是只想让他看到部分设备,这样的话,是不是我在数据权限点这里要进行范围的控制,等于我把设备作为数据权限点,进行按需授权?

    来自福建 回复
    1. 可以考虑将颗粒度细化,将设备型号作为数据权限点,进行增删改查控制

      来自广东 回复
    2. sorry,现在才回复。
      问题里的功能权限是比较明确的:新增设备、查看设备
      数据权限的问题首先明确2点:
      1、系统中设计的组织架构是怎样的。
      2、用户和设备都是每个结点的资产,即一个结点中包括用户和设备还有其他未提及的实体。

      针对以上思考和用户体验,如果是我做的话我会这么设计:
      1、自己创建的自己能看到(就是文中结点间的数据共享方式中的:结点里的用户只能看到自己的数据)。这个很好理解,自己创建完查看不到很奇怪,无法验证自己创建的是否正确。
      2、企业域场景的数据权限一般是上层结点高于下层结点,为了不至于创建设备的用户可以看到上层结点的设备,应该在用户创建设备的时候就进行权限的控制,比如问题中的用户只能创建所属结点或下层结点的设备。

      具体到问题,我认为创建设备的时候通过分配设备所属结点就决定了设备可以被哪些用户看到。
      我理解你的问题是单纯的把设备作为数据项分配给用户(不知道理解的对不对),这种方式在理论上可行,但是操作成本太高,设计时考虑不全面也会导致权限的混乱和漏洞。

      来自北京 回复
  13. 点个赞

    来自浙江 回复
  14. 现在遇到数据权限也需要用户设定。权限这块灵活度超高,什么都是用户去设定。界面设计很头疼

    来自广东 回复
    1. 是不是将数据权限分组,或者将数据权限、功能权限糅合到角色里,再行分配给用户。不过本身这个需求的复杂度已经很高了 😉

      来自北京 回复
  15. 在纠结一个点,账号管理,角色管理,需要做数据权限吗?例如公司总负责人给各部门负责人分一个账号和一个部门权限,那么部门负责人就只负责管理自己部门的人 的账号和权限,他要去建账号 这个账号的权限

    来自广东 回复
    1. “公司总负责人给各部门负责人分一个账号和一个部门权限,那么部门负责人就只负责管理自己部门的人 的账号和权限,他要去建账号 这个账号的权限”是否需要把“用户管理” 其实这是功能权限的问题:这个功能是否需要分给其他层级的用户去做,需要考虑:系统用户量级是否非常大,不分出去系统管理人员的工作量无法估量的话那就分出去。
      而哪个层级的哪些用户能看到哪些用户列表才是数据权限的问题,这个要考虑公司的组织架构,数据安全、机密等问题了。
      希望回答帮助到了你~

      来自北京 回复
    2. 亲 有权限管理的原型参考下吗?要做功能权限和数据权限,有点头疼

      来自广东 回复
    3. 同求

      来自广东 回复
  16. 权限管理的过程是分开完成还是一起完成?只管理操作权限或数据权限还是在管理操作权限的同时完成数据权限的设置?

    来自山东 回复
    1. 从用户操作层面看,选择角色的过程中完成了功能权限的配置,数据权限早已随着他的所属结点确定。
      从架构设计层面看,一开始是分开设计的,一般先做功能权限,最后会数据和功能结合看。但没有既定的规则,想清楚就好。

      来自台湾 回复
    2. 有原型可以分享吗?

      来自山东 回复
    3. 原型中只会体现功能权限,不会有数据权限,数据权限需通过文档描述。不过我做过的都是企业的,涉密。我找找有没有可用的哈~

      来自台湾 回复
    4. 超级管理员可以管理操作权限和数据权限,数据权限不应程序写死,当然,简单的业务和简单的组织写死就可以了,复杂的业务、组织要求更加灵活,应实现可视化配置

      来自山东 回复
    5. 确实写死对于开发周期来说很舒服,但是自定义配置的话开发周期相对要长很多

      来自广东 回复
    6. 同问数据权限如何可视化管理

      来自河北 回复
    7. 求原型,最近也是在做数据权限和功能权限,头疼

      来自广东 回复
    8. 意思是数据权限其实是可以通过代码层去写规则实现,无需放到操作层面上,可配置的最多是父子结点的共享数据关系,在TO G项目中,数据权限确实头疼

      来自广东 回复
  17. 很受益

    回复
  18. 好顶赞!

    来自四川 回复
  19. 挺好的
    您将权限分成功能权限和数据权限,看看是否可以将功能权限细分成菜页面权限和操作权限
    页面权限:就是用户能看到什么页面
    数据权限:同一个页面下,不同用户可以看到什么数据
    操作权限:相同数据不能用户能对其进行什么操作(一般分为:查看、编辑和完全控制)

    来自浙江 回复
    1. 哈哈,我是把页面权限当成功能权限的一种,不过你这个思路也很好玩儿,我沿着这么分想想~

      回复