第六章:我的权限控制方法论——分布式权限控制

发布于

文章大纲

一、分布式角色权限体系

1、前后端分离的分布式权限控制

2、前端的多端分布式权限控制

3、后端的多模块分布式权限控制

二、分布式凭证权限体系

无论在哪个SAAS或是管理系统中,权限控制的设计都是一个复杂的事情。

我们先看一下Wordpress的权限设计。

CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
create_sitesY     
delete_sitesY     
manage_networkY     
manage_sitesY     
manage_network_usersY     
manage_network_pluginsY     
manage_network_themesY     
manage_network_optionsY     
upload_pluginsY     
upload_themesY     
upgrade_networkY     
setup_networkY     
CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
activate_pluginsYY (single site or enabled by network setting)    
create_usersYY (single site)    
delete_pluginsYY (single site)    
delete_themesYY (single site)    
delete_usersYY (single site)    
edit_filesYY (single site)    
edit_pluginsYY (single site)    
edit_theme_optionsYY    
edit_themesYY (single site)    
edit_usersYY (single site)    
exportYY    
importYY    
CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
install_pluginsYY (single site)    
install_themesYY (single site)    
list_usersYY    
manage_optionsYY    
promote_usersYY    
remove_usersYY    
switch_themesYY    
update_coreYY (single site)    
update_pluginsYY (single site)    
update_themesYY (single site)    
edit_dashboardYY    
customizeYY    
delete_siteYY    
CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
moderate_commentsYYY   
manage_categoriesYYY   
manage_linksYYY   
edit_others_postsYYY   
edit_pagesYYY   
edit_others_pagesYYY   
edit_published_pagesYYY   
publish_pagesYYY   
delete_pagesYYY   
delete_others_pagesYYY   
delete_published_pagesYYY   
delete_others_postsYYY   
delete_private_postsYYY   
edit_private_postsYYY   
read_private_postsYYY   
delete_private_pagesYYY   
edit_private_pagesYYY   
read_private_pagesYYY   
unfiltered_htmlYY (single site)Y (single site)   
unfiltered_htmlYYY   
CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
edit_published_postsYYYY  
upload_filesYYYY  
publish_postsYYYY  
delete_published_postsYYYY  
edit_postsYYYYY 
delete_postsYYYYY 
CapabilitySuper AdminAdministratorEditorAuthorContributorSubscriber
readYYYYYY

基于用户角色和用户等级,实现分层次的角色权限控制体系。

Wordpress权限控制系统是一个非常经典的权限控制系统,但是,因为Wordpress在用户和权限方面做得非常“轻量化”,所以,Wordpress的权限控制系统可以说只是一个完整的“骨架”,然而,仅仅是一个骨架也足以让很多人头昏脑胀。

所以,你可以想象一下,在那些大系统、复杂系统中,权限控制能复杂到多么地令人发指。

我曾经做过很多很多产品,涉及面也很广,权限控制系统几乎是每个产品都会涉及的,所以在这方面积累了大量的经验。

我曾经无数次优化和简化各种权限控制系统。最终总结出一套简单有效的方法。我把这套方法称之为:分布式权限控制。

权限控制之所以复杂,最根本的原因是因为集中式的权限设计、分配和管理导致我们不得不“集中式”地,上帝视角地去考虑各种各样的角色在各种各样的场景中的“能”和“不能”。

而,如果,权限的分配和管理被分散开,那么,一切都将变得简单得多了。

一、分布式角色权限体系

经典的权限控制体系都是集中式的角色权限体系。

角色权限体系,一直是主流。

这里介绍的是分布式的角色权限体系。

无论集中式还是分布式,角色权限体系有一点是相同的:角色决定权限,是什么样的人决定了有什么样的能力。

分布式角色权限体系可以分成三种。

[pms-restrict subscription_plans = “1125”]

1、前后端分离的分布式权限控制

在前后端分离的开发模式流行之前,权限的控制只能完全地在后端控制,所以才需要依赖集中式的、复杂的权限控制系统。

而在前后端分离的开发模式中,权限控制完全可以实现前后端的分离。

后端主要负责角色的划分、分配和管理等框架性的事情,前端主要负责根据用户角色实现具体的、细节的权限的控制。

在集中式的角色权限体系中,后端,不仅要分配和管理角色,还要决定每个角色能做什么和不能做什么,然后还要“控制能力”部署到各个地方,最终实现权限的控制。

而在前后端分离的分布式权限控制中,后端只需要分配和管理角色,不需要决定每个角色的“能”与“不能”,也不需要实现具体的权限控制,而是由前端决定每个角色的“能”与“不能”,也由前端实现具体的权限的控制。

那么,整个权限控制系统将变得简单地多,同时,前端的权限控制会更加灵活。

这样一来,就大幅度的降低了权限控制的复杂度。

2、前端的多端分布式权限控制

权限控制实行前后端分离后,可以再将前端多端化。

这里说的多端,实际上是按角色划分的多端。

在很多时候,不同的角色是不需要用同一个“端”的。比如,打车类的产品。乘客端和司机端是完全可以分开的。两个角色的需求完全不同。

乘客端根本不需要考虑司机的需求,司机端也根本不需要考虑乘客的需求。所以乘客端和司机端对于权限控制的要求就变得简单了很多。

所以,在做产品的时候,就需要我们更多地考虑使用这个产品的角色都有什么,需求又分别是什么?

3、后端的多模块分布式权限控制

可以把它理解成权限控制的“微内核架构”和“微服务架构”。

简单的说,就是每个模块都有自己独立的、同时又是按照和其它模块或“内核”同一个标准建立的一套角色。为了方便,我把这样的一套角色命名为“角色系列(role series)”。

一个用户可以拥有多个角色,但,每个角色系列,一个用户只能有一个角色。

这是原则。

这样,用户在某个角色系列中的角色就决定了他在相应的模块中的权限。

权限控制的“微内核架构”和“微服务架构”稍有不同。

  • 权限控制的“微内核架构”

集中式的角色分配和管理,分布式的权限控制的实现。类似前后端分离的分布式权限控制。

也就是说,每个模块的角色系列都依赖“内核”的角色体系框架,并且由内核完成角色的分配和管理。但是,每个模块的权限的控制完全由模块自己处理。当模块被启用时,“内核”中才会由这个模块相应的角色系列。当模块被关闭后,“内核”中也不再由这个模块相应的角色系列。

这种方式是我比较推荐的,和权限控制的“微服务架构”想比,在角色整体的管理上会更加方便。

  • 权限控制的“微服务架构”

和“微内核架构”不同。“微服务架构”更加“分布式”。

权限控制的“微服务架构”,每个“微服务”都有自己完全独立的角色权限体系。然后用户使用哪个“微服务”模块时,便拥有那个模块分配的的角色和权限。

因为每个“微服务”模块都是处理一些小的功能和业务,所以它的角色权限体系会比较简单。

这样一来,就将整个系统复杂的权限控制分散到各个“微服务”模块上,从而整体上降低权限控制的复杂度。

要采用这种分布式权限控制,需要谨慎,因为每个“微服务”模块的角色如何分配是一个很重要的问题。

其它的分布式权限控制,角色的分配和管理都是集中式的。而这种分布式权限控制,连角色的分配和管理都是分散在各个模块中的。

权限控制的“微内核架构”和“微服务架构”不建议混合使用,会很麻烦。

二、分布式凭证权限体系

和角色权限体系完全不同,凭证权限体系的核心是:凭证决定权限,也就是,用户有什么凭证就有了什么能力,失去某项凭证就失去某些能力。

这个,其实很好理解。

比如,我们去电影院看电影,我们需要先买一张电影票,然后凭着这张电影票,我们才能进入影厅看电影。

而,这张电影票就是凭证。

这就是凭证权限体系。

最常见的几种。

  • 优惠券

这个恐怕是我们最常见到的。优惠券就是一种凭证权限体系。有某个优惠券就能享受某项优惠权益,没有,就不能享受这个权益。

  • 基于订单的权限控制。

在一些电信、金融之类的业务中,由于各种业务产品种类繁多,并且都不是实体商品。所以,很多时候会采用基于订单的权限控制。有什么样的订单,就有什么样的权限。当订单失效或是过期了,相应的权限则消失。

这种情况下,权限的控制就会变得简单地多。

  • 开放平台的APP token

玩技术的都知道,一般开放平台对API的调用限制,是通过给每一个APP分配token实现的。(APPid、APP secret、APP key、APP token,各个平台的名称会不太一样)。

凭证,可以是订单、可以是某种卡券(比如优惠券、会员卡等)、可以是一个token、也可以是一份合约等等。

到目前为止,基于凭证的分布式权限控制的应用是比较少的。

实际上,从根本上来说,角色权限体系本质上就是集中式权限体系,无论采用哪种方式将它“分布式处理”,它依然是集中式的整体架构。

而,凭证权限体系,本质上就是真正的分布式权限体系。

我们以前做的产品、系统,从根本上说都是集中式或类集中式的系统,所以,采用分布式凭证权限体系的场景比较少。而,随着区块链和WEB3的不断深入发展,我认为未来,更多的场景会需要分布式凭证权限体系。

另外,角色权限体系和凭证权限体系是可以混合使用的。而且,实际上,到目前为止,用到凭证权限体系的系统,往往也是以角色权限体系为主的。

[/pms-restrict]