细粒度资源访问权限控制的入门级使用

在项目的实际开发中,经常会遇到需要对资源进行详细的权限控制的需求,而现有的权限框架,例如:SpringSecurity只能进行接口层面的权限控制。举个简单的例子,小区有门禁、每个住户都有自己特定的钥匙,而SpringSecurity就好比小区的门禁,可以控制当前住户是否有权限进入小区(接口调用权限的校验),但是却不能控制是否可以进入某个具体的房屋内(特定资源类型的校验)。当然,你也可以将不同类型的资源设计成不同的接口,但是却始终无法实现针对特定资源的访问权限控制。

1.资源访问权限控制定义

我们可以将资源访问权限控制做一个简单的定义,就是:用户对某一个资源主体是否某种特定权限。这里的用户可以是某个具体的用户,也可以是具有某种角色的用户,还可以是某个组织下的所有用户等等;而资源主体就是我们要访问的目标资源;某种特定权限无非就是读、写操作的权限。

2.数据库表设计

根据上述定义,结合实际需求可以进一步将整个资源访问权限拆解为五个部分。用户可以进一步拆解为用户类型以及该类型下某条记录;资源主体可以进一步拆解为资源类型以及该类型下的某条记录。具体的数据库表设计如下:

OWNER 权限拥有者表(也可以理解为资源访问者)
ID:主键
USER_TYPE_:用户类型
USER_ID_:用户类型对应的主键
复制代码
RESOURCE_OBJ_TYPE 资源主体类型表
ID:主键
OBJ_TYPE_ID_:资源类型id
OBJ_TYPE_NAME_:资源类型名称
复制代码
RESOURCE_OBJ 资源主体表
ID:主键
RES_OBJ_TYPE_ID_ 资源主体类型,对应资源主体类型表的主键
OBJ_ID_ 资源主体id,某个资源类型下的唯一标识
OBJ_NAME_ 资源主体名称
复制代码
AUTHORITY_ 权限表
ID:主键
OWNER_ID_ 权限拥有者id,对应权限拥有者表主键
RES_OBJ_ID_ 资源主体id,对应资源主体表主键
PERMISSON_ 具体权限信息
复制代码

3.实现思路

当某个用户想访问具体某一个特定资源时,通过数据库查询的方法获取到具有访问当前特定资源权限的OWNER_ID_集合,再与当前用户所具有的身份信息相比对,如果两者存在交集,则说明用户具有访问权限

此外可以针对权限进行更细粒度的控制,比如说用户只能进行读操作,则可以获取只具有读操作的权限拥有者集合等等,考虑到后期可能资源主体表数据的不断累加,可以针对资源类型进行分表操作或者采用一下开源的分表框架等等。如果只是频繁的进行读取,也可以考虑加入权限缓存

至于数据持久层可以考虑使用Mybatis-plus或者SpringData JPA等多种方式,因为只是涉及到一些基本的数据操作所以此部分省略

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享