别人家的SaaS为啥就是好用——权限体系设计实战分析
本文主要介绍B端产品中权限体系的设计模式,并赋予实际案例展示。
一、权限体系简介
权限管理是一个几乎所有大中型B端系统的都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制,而针对的对象是员工,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,数据泄露等问题。
抽象来看权限体系可以分为如下两类:功能权限与数据权限两部分:
- 功能权限:指的是在系统中的一系列操作。常见的如:删除,编辑,提交等
- 数据权限:指数据中存在的数据是否能查看,如:钉钉中个人的出勤数据每人能看到,但是全公司的考勤数据却只有管理员能看到。
在这里权限的实现一共有两种模式:
“所见即所得”模式
用最通俗的话来说也就是,能看见相关操作就能执行对应的操作,所有的权限限制就在隐藏对应的操作页或按钮上,不进行区分查看与操作。
例如一个项目管理软件,当用户拥有了访问项目操作页的权限,在本模式里该项目的增删改查都对应拥有了,这里的核心就是只要能看到就能操作。
这个模式的好处是适合中小型B端客户,其本身没有复杂的岗位划分且要求系统简单易上手,毕竟一款B端的产品要是权限让用户配置半个小时,这对用户来说是个无比巨大的负担。
根据我的经验来看“所见即所得”这种模式基本满足80%的SaaS系统对权限管理的需求。
“读写分离”模式
所谓的读写分离,就是在第一种模式上进行了升级(这里的写泛指一切关于某模块的操作)。
怎么理解呢?当我们拥有了进入该页面的权限时,如果没有分配写的权限,就算看到了这些操作也不能使用。这种模式多用在数据权限上,而功能权限上是多用于预告给用户,只有当用户完成指定条件时才可以去操作。如未完成指定信息填写时,不能点击提交,但是提交按钮必须要在页面出现。
如果让我们用一张图来阐明这两种权限的设计体系的话,应该是这个样子的:
图:权限颗粒度
二、功能权限设计
具体来说我们可以划分为如下三步:
图:设计步骤
让我们一步步来看:
步骤1:功能点封装
这里就是将我们系统中的功能进行梳理,得出一颗完整的功能树。你的权限系统想要控制到哪一层级,就将功能拆分到对应的层级即可。
例如:
图:功能拆分示例
步骤2:权限授予
在拆分完功能点后,我们就相当于有了一个完整的系统权限表(也称之为权限池),可以清楚的告诉用户什么环节可以进行配置,接下来我们需要设计的就是如何让用户去分配权限,即:权限授予。
在权限授予上我们要满足如下两个基本方向的设计:
- 角色概念:角色的理解,我们可以简单的理解为是一个个权限的集合。它通过提前将一部分权限进行配置成通用模板,随后只需将需要的人员授予这个角色就能拥有对应的权限。
- 权限池内自定义授予:在SaaS软件里经常我们会遇到这样的情况,之前我们配置的某某部门经理或助理的角色由于临时性工作借调可能会涉及多个岗位的工作,从而导致之前的角色权限不能满足,而此时这种个例现象又不好再单独创建角色给他,因此需要能在角色外再单独指派权限的功能。这里我们就称之为权限池内自定义授予。当然这里也适用于不在角色表中的任意权限分配。
值得提一句的是:一般的权限系统中要支持一人授予多个角色的功能。
步骤3:权限累加器
想必在步骤2大家肯定有疑问了,一人可以承接多个角色,又可以自定义额外权限,这样到最后个人权限要怎么定呢?
这里的权限累加器其实就是在解决这个问题,这里相当于是一个单独权限计算器,通过将前后授予的权限进行累加得到用户的最终权限。
这里的计算规则如下:
- 计算1:将变动前的权限集合在被授予新权限集合后两者取并集,去重相同的权限;
- 计算2:最终权限 = 角色权限 + 权限池内自定义授予权限
在一般权限授予中,我们给予权限一般都是越给越多。但是也有可能会是将某一角色的权限进行统一减少,此时我们就需要交由累加器帮我们去批量将多个拥有该角色的权限进行计算。
举个例来看:
在上面的例子中,我们的权限体系在上面进行了三次变动:
第一次:U298,278两位用户获得了初始员工权限并给予了发布新闻权限,此时由权限累加器帮我们计算出共拥有了7个权限;
第二次:新增了两位用户,并将四位用户在员工角色上又增加了部门助理角色,并额外增加了数据查看权限,此时权限累加器计算出这四位用户权限数为:
员工角色与部门助理的权限相同权限6项 + 部门助理独有的4项权限 + 发布新闻权限 + 数据权限 = 12项;
第三次:四位用户的共有角色部门助理被减去了一个权限,此时权限累加器计算出这四位用户权限数为11;
三. 两种实现示例
“所见即所得”模式
让我们直接进入权限模块来看。
首先进入系统管理面板:
在进入内部人员管理界面进行权限配置:
这里由于原来系统的业务颗粒度本身不高,因此我只将功能划分到页面级,也降低了企业管理员的学习配置成本。在这部分里,用户只需给每位人员配置拥有什么页面的访问权限,就有了对应的功能权限。
举例来说如果在上页我勾选拥有了审批配置权限,也就是可以进入审批模板列表页,因此这里所有的功能都可以使用。
“读写分离”模式
这种模式其核心在上文已经介绍过了,就是将每个页面内还要进行只能查看与能编辑两种状态。
具体来看看配置页的实现:
大家可以看到在这里配置的颗粒度更细,在每个页面中都进行了进一步划分,分为查看名称,进入详情,删除三大权限。
而功能页是这个样子的:
综上
对于权限模块来说,在上面介绍的两个思路中没有所谓绝对正确的解决方案。我们应该做的是去选择最适合自己业务体量的设计模式,避免出现“小马拉大车”的现象。
PS. 如果喜欢,自愿订阅,投食,良心不痛!
本文由 @ 三爷 原创发布于人人都是产品经理。未经许可,禁止转载
题图来自Unsplash,基于CC0协议
角色应该和权限拆分开
在企业内部存在角色的概念,如果把角色和权限绑定,会产生问题:比如,企业里面有两个人事a,b,有三个人事权限A,B,C,经常会遇到a有A权限,b有B,C权限,如果把A,B,C和人事这个角色绑定在一起,就会造成赋权问题,可以尝试以下办法:
权限池必须有,在权限池中预设权限组
角色和人员绑定,利用角色进行赋权
功能权限通过以上方式来。
再说操作权限,不外乎增,删,改,查(以及这几个封装在一起的完全控制),这些采用读写分离的方式,结合上面的权限池
权限组是什么概念?
权限组是对权限进行一个分类,主要是将模块操作的权限进行打包在一起
有点意思,经常会遇到a有A权限,b有B,C权限如果是一个问题需要这三个权限才能解决,那岂不是更麻烦了
权限和用户是分离的啊,如果你需要一个人有A,B,C三个权限,你用角色把人员和权限关联起来就可以
不错
哈哈