权限,可分为“功能(操作)权限”和数据权限两种,在系统中,两种权限应当同时有效。例如,在windows系统中,某用户具有新建一个文件的功能权限,该用户在C盘没有写权限,但在D盘有写权限;则该用户不能把他创建的文件保存在C盘而只能保存在D盘。
在上述例子中,能否创建文件是由功能权限来控制的,能否保存文件是由数据权限进行控制的。只有两者同时有效,用户的业务才能顺利进行。
² 功能权限:
也叫操作权限,指的是允许或拒绝用户使用系统提供的某个功能。
² 数据权限:
指的是允许或拒绝用户进行某个数据的增删改查操作。
² 授权:
指的是分配具体的权限给具体的人。
² 鉴权:
指的是对具体人的行为,根据权限规则进行合法性鉴别。
对于授权来说,需要定义的有且只有权限和授权对象两个要素。简而述之,对于功能操作就是“什么功能授权给哪个用户来操作”。同样,对于数据,就是“什么数据授权给哪个用户来操作”。
一般情况下,我们并不会对单一的功能/数据进行单用户的授权管理,因为这样用户操作起来显然非常麻烦。为了方便和简化操作,一般的授权规则是:
哪些功能/数据授权给哪些用户
在实际的授权管理中,我们总是根据业务的需求,将一些在业务上不可分割的、需要允许用户一起使用的功能,组合成一个权限集合进行统一授权。对于这样的权限集合,我们一般称之为“角色”。也就是说,我们通过角色来定义用户被允许使用哪些功能和访问哪些数据。当然,我们一般把功能和数据分开来进行授权,以便获得更加灵活的权限规则配置方法,以适应更广泛的授权需求。
由于某些不同用户在该业务上需要具有相同的权限,那么这些不同的用户在特定的业务上就具有了共性,可以作为一个抽象的用户来进行权限的授予。授权管理使用的抽象的用户,也就是用户集合,除了普遍使用的“用户组”外,还可以引用别的业务中所使用的对象。例如组织机构管理中的“机构/部门”、“职位”和工作流中使用的“岗位”等,在授权管理中都是作为用户集合使用,本质毫无二致。
通过让抽象的用户扮演角色,即可使这个抽象的用户所代表的真实用户获得完成业务所需的权限。通过这样的方式,可以简化授权管理,方便用户操作。
将特定的权限授予特定的人群的过程,我们称之为“授权”。为了能够方便地进行授权操作,我们必须要有一个能够提供合理授权方法的用户界面。
对于一个可扩展的系统来说,意味着功能是不断变化的。为了适应这种不能事先确定的变化,必须将功能权限进行分散管理。分散管理的好处如下:
² 天然地支持业务的动态变化,系统实现简单。
² 权限的调整范围可控制在局部范围,方便权限的管理和操作。
功能权限是单维度的,可以通过简单的在功能列表或功能树上进行勾选来确定一个“角色”所允许的功能操作。然后,让相应用户成为该“角色”的“扮演者”。这样就可以把该角色所允许的功能操作授权给指定的用户了。
如果需要有更多的不同角色,那么新建角色,勾选不同的被允许的功能操作,并分别让相应的用户成为新角色的成员即可。
如果某个特定用户张三需要额外的一个权限,那么新建一个允许该功能操作的角色,并让张三成为该角色成员即可使张三拥有额外的权限。
如果某个特定用户李四需要比同一项目组的其他人少一个权限,那么新建一个拒绝该功能操作的角色,并让李四成为该角色成员即可使李四不能进行该项操作。因为在鉴权过程中,拒绝的优先级要高于允许。
数据在系统中共同的特性有如下维度:
² 业务维度:不同的业务产生不同的数据
² 生产者维度:相同的业务会有多个数据生产者和生产部门
有些业务需要用户访问其他业务的数据,或者是其他数据生产者中特定生产者的生产的数据。简单的说,就是数据权限的授予必须支持跨业务和跨部门。
由于数据的特殊性质,实际上在有限范围内的授权比功能权限的授予更加方便。因为生产部门和生产者具有天然的分类属性,所以象“本机构”、“本部门”、“本人”这些对生产者维度的进一步抽象就有了用武之地。
在不对业务维度做限定的情况下,就可以配置例如“允许本部门的成员管理(增删改查)本部门的数据”这样的权限规则。那么对于不同部门的用户,这条共同的规则所产生的效果并不相同,具体的效果是与用户所在的部门的业务和产生的数据相对应的。
根据以上分析,我们可以内置一些抽象规则,例如:
² 允许管理本机构(含下级机构/部门)的数据
² 允许管理本部门(含下级部门)的数据
² 仅允许管理本部门的数据
² 仅允许管理本人的数据
² 允许查看本机构(含下级机构/部门)的数据
² 允许查看本部门(含下级部门)的数据
² 仅允许查看本部门的数据
² 仅允许查看本人的数据
一般数据权限的授予只能局限于符合高度抽象规则所限定的范围。如果要在这个范围之外的数据进行授权,例如想让财务部的人访问采购部的数据,显然是一般数据授权所不能支持的。
这个时候,我们就必须要提供用户在角色中自由定义允许或禁止用户访问的数据集的方法。上面说过,一个数据需要在业务和生产者两个维度上进行描述,才能确定数据。那么在定义角色所允许访问的数据集时,因为授权分散在不同的业务中,所以业务是确定的,剩下的就是需要指定一个或多个生产者。在这里,生产者可以使用抽象方法进行归纳分类。
最后,类同于功能权限的授权方式,我们把定义好的角色分配给一个抽象的用户即可将一个自定义的数据权限授予抽象用户代表的真实用户。