# 数据权限控制

某些场景下搜索查询需要绑定一些强制条件,用于数据权限控制,如只能查看本部门的数据。 不同于租户的全局SQL拦截,这种场景需要的是在指定业务场景里过滤查询数据,diboot 数据权限就是这种场景的解决方案。

# 数据权限使用步骤:

示例场景:如项目业务对象有个部门id字段,需要控制用户只能访问本部门的项目数据。

# 1. 在需要数据权限控制对象的Entity中的字段上添加@DataAccessCheckpoint注解,指定CheckpointType。

示例代码:

public class Project extends BaseEntity{
    // ...
    // 数据权限检查点
    @DataAccessCheckpoint(type = CheckpointType.ORG)
    private Long orgId;
    //...
}
1
2
3
4
5
6
7

# 2. 实现DataAccessInterface接口,返回当前用户可访问的对应CheckpointType的合法ID集合

@Component
public class DataAccessPermissionImpl implements DataAccessInterface {
    @Override
    public List<Long> getAccessibleIds(CheckpointType type) {
        // 返回对应检查点的当前用户可访问的合法(org)id
        if(type.equals(CheckpointType.ORG)){
            return Arrays.asList(100001L, 100002L);
        }
        ...
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 3. Spring config类中配置Mybatis-plus数据权限拦截器,启用数据权限拦截

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    // 启用diboot数据权限拦截器,将拦截并修改需要控制数据权限的SQL
    // 之前版本 interceptor.addInnerInterceptor(new DataAccessControlInteceptor());
    // @since v2.4.0
    interceptor.addInnerInterceptor(new DataAccessControlInterceptor());
    return interceptor;
}
1
2
3
4
5
6
7
8
9
10

这样就可以针对Project数据查询的SQL中,强制添加 org_id IN(100001, 100002) 的过滤条件,实现数据访问控制。

# 4. 补充说明:不同岗位的数据权限配置

如果您的业务场景中数据权限跟岗位级别关联,不同级别用户可以访问不同范围的数据,可以结合前端岗位管理中的数据权限设置,实现前端配置后端控制。 岗位中的数据权限配置示例