做To B的系统总是遇到权限管理的问题。权限管理不是业务功能,但它确实整个系统的基础,决定着各功能是否可用、系统是否满足企业客户的管理需求。而ToB的SaaS系统由于需要面对众多企业客户的不同组织架构与管理需求的使用场景,对权限管理的可配置性要求更高。那么到底如何梳理并设计一套既能灵活配置,又能满足企业的严格权限管理需求的ToB SaaS系统的权限管理机制呢?
什么是权限
系统中的权限一般包含两种:功能权限与数据权限。再进一步细分,功能权限包括页面权限与操作(按钮)权限,数据权限分为字段权限与数据范围。
权限管理的设计思路
毫无疑问,目前最为流行的权限管理模型是RBAC(Role-Based Access Control)。
但是,如何设计并使用角色?哪些权限归为一个角色?设计并使用哪些角色?是否系统固化角色及其权限?针对不同的系统,不同的业务需求有不同的设计方案。
首先,我们把ToB的SaaS系统划分为两类:专用型 与 通用型。专用型SaaS指的是该SaaS主要提供专业的某些工具,如Salesforce的CRM 提供客户关系管理的工具,腾讯会议提供远程会议的服务;通用型指的是面向企业客户覆盖跨部门的业务或覆盖大部分甚至全部业务的SaaS服务。
对于专业性较强,功能覆盖集中的专用型SaaS系统来说,可以基于功能点或者基于用户的场景抽象出典型的角色进行内置,这样做能够极大地减少用户在初始化及配置权限时的工作量及复杂度,但有四个前提是:
对于通用性的ToB SaaS系统与业务流程关联度不高的专用性ToB SaaS系统来说,由于该系统面向企业的各个部门,与部门业务往往紧密相关,而企业的业务发展或管理思路的变化可能导致企业客户的组织架构会变化,岗位职责也可能会有调整,通过梳理出一套覆盖所有业务场景的合适的角色并保证角色能够适应未来企业客户的业务与管理需求,几乎是不现实的。
所以,一般情况下,通用性的ToB SaaS系统或与企业管理流程紧密相关的专用性ToB SaaS系统,笔者认为基本的系统管理角色内置,业务角色可配置应该是更现实的选择。具体做法如下:
具体的创建默认角色与权限的逻辑可以参考上图。其中,不同部门的相同岗位使用一个角色 还是 不同部门的不同岗位使用不同的角色,可以根据潜在企业客户的组织机构及岗位的标准化程度来确定:如果面向的客户企业的不同部门之间的相同岗位的职责与权限差别比较大,那么应该根据部门&岗位创建角色;如果不同部门的相同岗位的职责与权限比较类似,那么可以直接根据岗位创建角色(即不同部门的相同岗位具有相同的角色)。另外,如果选择后者,具体的数据范围权限可以根据角色所属部门来确定,从而降低数据权限配置带来的使用上的复杂度。
注意:为了保证业务模块与权限管理模块的松耦合,业务模块的代码中无论如何都不应该出现角色名字或角色ID。
具体实现
系统的涉及到权限的地方可以分为两个部分:权限管理模块本身 和 业务功能。两者之间应该保持松耦合的原则,只通过权限ID或名称进行关联。
下面是权限管理模块的数据库表设计。
开源项目Shiro(https://shiro.apache.org/)提供了一套Java安全框架(身份认证、授权、加密、会话管理)。基于Shiro+JWT+SpringBoot,可以方便地实现对系统功能权限及数据权限的灵活配置与管理。
结束语
权限管理虽然无法直接满足用户的业务需求,但是不好的权限管理设计却足以摧毁整个ToB SaaS系统,让系统变得无法满足企业的管理与业务需求。因此,一个良好而优雅的权限管理模块的设计是整个系统的基础。基于RBAC模型,并且做到权限管理模块与业务功能模块松耦合,对整个系统至关重要。