数据权限控制
Last updated
Last updated
在RBAC权限控制中实现了基于角色的权限控制,但是只能控制到操作(按钮)级别的权限。 在某些场景,可能还需要更细粒度的权限控制,比如: 控制普通用户只能查看自己创建的数据,部门经理可以查看自己部门下所有人员的数据,管理员可以查看和修改所有数据。hsweb实现了灵活的数据权限控制,默认提供了多种控制逻辑。
数据权限配置(DataAccessConfig): 用于配置数据权限的控制逻辑
动态条件(QueryParamEntity): 用于支持动态查询的参数实体
使用AOP拦截请求,根据用户的数据权限配置
修改请求参数或返回值。
在方法或者类上注解 @Authorize(permission="user",action="query",dataAccess=@RequiresDataAccess) 即开启数据权限控制,此注解只用于声明需要进行数据权限控制,具体的权限控制逻辑由数据权限配置去实现。
数据权限只会修改被控制接口的参数,不会侵入到更下层的Service和Dao,因此在使用声明式数据权限的时候,查询时应该使用动态条件
。
数据权限配置是根据permission和action进行关联,因此在最终的权限控制声明(AuthorizeDefinition
)中,permission和action不能为空。
除了声明式数据权限控制,还可以通过编程式进行控制:
数据权限配置是根据permission
和action
进行关联的,在权限信息(Authentication(permissions[{dataAccess:[ 数据权限配置 ]}])
)中保存用户设置的数据权限。数据权限配置在权限(Authentication
)初始化的时候根据具体的AuthenticationManager
实现进行初始化。
DataAccessConfig
接口由action
和type
字段组成.action
用于标识在进行什么操作的时候需要进行数据权限控制,和RBAC权限中的action对应。 type
为配置类型的标识。具体的数据权限控制配置,需要实现此接口。
不同的数据权限有不同的配置,在权限初始化的时候,不同的配置由对应的DataAccessConfigConvert
实现进行初始化。使用DataAccessConfigConvert
的目的是:数据权限的配置是动态的,配置的来源也不同,可能是配置文件,数据库或者jwt,使用DataAccessConfigConvert
接口,可以灵活的拓展各种数据权限配置。
hsweb-authorization-basic
模块实现了DataAccessController
来进行数据权限控制,获取spring容器中所有实现DataAccessHandler
接口的bean. DataAccessHandler
就是具体的控制实现。在接收到请求的时候,如果需要进行数据权限控制(permission
和action
匹配的DataAccessConfig
),使用策略模式依次调用DataAccessHandler.isSupport(DataAccessConfig)
方法,判断DataAccessHandler
是否支持,如果支持,则调用DataAccessHandler.handle
方法完成控制。
已经提供了2种权限的配置方式:
配置文件方式
数据库配置方式,查看文档
上文中已经接受了数据权限配置的逻辑,在需要自定义数据权限控制的时候,只需要: 1. 创建自定义数据权限控制的配置,并实现DataAccessConfig
接口。 2. 创建DataAccessConfigConvert
实现类实现对应方法并注入到Spring。 3. 创建DataAccessHandler
实现类实现对应方法并注入到Spring,
完成。