权限系统设计
简单地介绍一下业内权限系统的设计方案权限的分类对于权限的控制,一般包含以下两个方面: 1.功能权限
简单地介绍一下业内权限系统的设计方案 权限的分类 对于权限的控制,一般包含以下两个方面: 1.功能权限 功能权限代表的就是一个用户是否有进行这个操作的权限,比如你有银行卡,你登陆了网上银行之后,就有取款的功能权限 2.数据权限 数据权限代表的是一个用户是否有对某个数据操作的权限,还是上面的例子,你有银行卡,而且有取款功能,但是你对自己的存款具有数据权限,你只能看到自己的存款,只能取自己的钱,对于别人的存款,你是不具有数据权限的
功能权限设计 对于功能权限,一般会设计出三个实体,分别是用户、角色、权限 一个权限代表着一个最小单元的操作,比如查看存款,取款,转账 一个角色则是和一个或多个权限相关联,比如银行系统中的普通用户是一个角色,普通用户这个角色拥有查看存款、取款、转账这些权限 一个用户则是和一个或多个角色相关联,比如某个用户账号既是一个普通用户,又是一个系统的后台管理员,那么他就同时拥有作为一个普通用户的功能权限和作为一个系统管理员的功能权限
功能权限验证 由于功能权限是对应着一个最小单元的操作,也就是对应着系统后台的一个方法,因此权限的验证也应该是基于方法级别的。权限系统需要提供一个拦截器,负责拦截业务系统收到的所有请求,然后将以下三个信息传递给权限系统: 1.当前用户的唯一标识 2.当前系统的唯一标识(假设权限系统是同时管理多个系统的权限控制) 3.当前请求需要操作的功能权限的唯一标识 权限系统接收到这三个信息之后,根据当前用户的唯一标识,获取其对应系统下(这里假设一个用户在多个系统下也是可以登陆的,也就是多个系统共用一套用户体系)的所有角色,然后根据这些角色获取到这个用户在这个系统下的所有功能权限的列表,最后再判断当前请求的功能权限是否在这个用户的权限列表之中,如果在,则表示该用户具有这个功能权限,不在的话就表示当前用户没有这个权限
数据权限设计 对于功能权限,上述的方案基本上已经是一个比较统一的标准了,可是对于数据权限来说,业内还没有一个非常完美的方案,因为数据权限的控制和系统本身的业务是紧密相连的,比如说银行系统、图书管理系统、SNS网站,这些系统对数据权限的控制、要求肯定是不一样的,而权限系统是独立于业务系统之外的,权限系统本身不可能了解到业务系统的业务,也不应该去了解业务系统的业务,因此对于数据权限的控制,权限系统是无法提供一套完美的解决方案的,一般的做法是,权限系统提供一个数据权限控制的标准,然后所有的业务系统按照这个标准去实现自身数据权限控制的目标。 一般来说,一条数据会有两个归属: 1.owner,表示创建这个数据的用户,比如说我在论坛的游戏频道发布一个帖子,那么我就是我这个帖子的创建者,这个帖子应该有一个ownerId的字段来标识这个帖子是我创建的,因此这个帖子只有我能够修改 2.organization,表示这个数据所属的组织(注意,这里的组织和平时我们说的组织的概念,有时候会不一样),比如上面的例子,这个帖子是在游戏频道发布的,那么这个帖子就应该是属于游戏频道这个组织 基于以上两点,我们可以对需要做数据权限验证的数据添加 ownerId 和 organizationId 这两个字段,并实现一个数据权限验证的接口 对于一个用户来说,他自己本身的唯一标识就可以看做是一个 ownerId,而用户也是有所属的,比如游戏频道的版主,他就是属于游戏频道这个组织的
数据权限验证 数据权限验证是基于功能权限验证的基础上的,当判断出当前用户有用功能权限,需要进行数据权限控制的时候,会有两种情况: 1.当前用户只是进行查询的操作,则业务系统会将当前用户需要执行的SQL传给权限系统,权限系统会根据当前用户的唯一标识和他所属的组织对SQL进行一个加工——在SQL的尾部添加 ownerId 和 organizationId 的判断条件,使得当前用户能查询到的数据是他有权限看到的 2.当前用户在进行修改、删除操作时,则权限系统会根据当前用户的 ownerId 和 organizationId 来判断他是否有权限去进行操作 上述说到的例子里面,其实还涉及到一个数据权限控制策略的问题,一般会有下面几种情况: 1.数据只有所属者可以进行操作,也就是只有ownerId匹配的时候,才能进行操作 2.数据在统一个组织内是共享的,也就是当期那用户的 organizationId 和数据所属的 organizationId 匹配,就能进行操作 3.组织之间有树型的层级关系,比如一个论坛分为游戏频道、小说频道,那么整个系统的管理员所属的组织是整个论坛,游戏频道版主的组织是游戏频道,那么系统管理员拥有其下属组织对应的数据的所有权限 在现实的情况中,数据权限控制的策略可能还有更多的情况,我们可以针对不同的情况去做更进一步的抽象
总的来说,一个权限系统需要做的事情大概就是这些,主要争议的地方是在数据权限的控制方面,更多的时候,我们会让各自的业务系统自己去完成数据权限的控制,而权限系统只做功能权限的控制,毕竟实现上面的那套数据权限的标准,在某些场景下是得不偿失的 |