Skip to content

数据权限(新)

在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。

例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。如设置只能看本公司、或者本部门的数据, 对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制。

盘古3.0的数据权限的相关功能再度升级,原来的数据权限功能已经不再支持,原来的common-datascope组件也不再进行维护。鼓励大家使用新的数据权限, 新的数据权限基于数据模型实现了数据维度、部门和敏感数据的权限控制,以满足不同的业务场景。 为了方便大家更便捷地集成盘古数据权限,专门提供了数据权限集成组件。

快速上手

选择数据权限组件

改组件是基于SpringBoot扩展,非SpringBoot项目无法使用。

如果ORM框架不是Mybatis,则可以使用数据权限的SpringBoot集成组件。

xml
<dependency>
    <groupId>com.hisense.pangea</groupId>
    <artifactId>pangea-datapermit-spring-boot-starter</artifactId>
    <version>${pangea.version}</version>
</dependency>

如果ORM是Mybatis,则可以使用数据权限的Mybatis集成组件。

xml
<dependency>
  <groupId>com.hisense.pangea</groupId>
  <artifactId>pangea-datapermit-mybatis-spring-boot-starter</artifactId>
  <version>${pangea.version}</version>
</dependency>

配置数据权限

yaml
pangea:
  datapermit:
    enabled: ${DATAPERMIT_ENABLED:true} # 数据权限开关
    client-properties: 
      base-url: ${DATAPERMIT_BASE_URL:https://inner-apisix-test.hisense.com/pangea-dp} # 数据权限服务地址
      server-path: ${DATAPERMIT_SERVER_PATH:/api/datapermit/open/getAllConditionData} # 数据权限服务接口
      user-key: ${DATAPERMIT_USER_KEY:xxx} # API网关user_key,订阅接口后获取
      system-name: ${DATAPERMIT_SYSTEM_NAME:pangea} # 系统名称
      env-code: ${DATAPERMIT_ENV_CODE:dev} # 环境代码
      ten-code: ${DATAPERMIT_TENANT_CODE:pangea} # 租户代码

其中,数据权限服务接口需要在技术中台的API市场进行订阅,订阅的接口如下图所示: 数据权限接口订阅

数据权限SQL处理

  • 非Mybatis组件需要手动调用SQL处理逻辑,示例代码如下:
java
@Service
public class DemoService {
    
    @Autowired
    private ConditionDataClient conditionDataClient;
    
    public String processSQL(String sql) {
        CurrentUserInfo userInfo = new CurrentUserInfo();
        userInfo.setLoginName("xuqiu");// 用于名
        userInfo.setRoleCodes(Arrays.asList("pangea3-admin")); // 角色编码
        userInfo.setOrgCodes(Arrays.asList("ORG-001")); //组织编码
        return this.conditionDataClient.processSQL(sql, userInfo);
    }
}
  • Mybatis组件会自动处理SQL,无需手动调用数据权限组件处理SQL,但是需要组件CurrentUserInfoProvider根据上下文获取用户信息, 如果项目集成了盘古的用户信息获取相关的common组件(pangea-common-security或者pangea-security-spring-boot-starter),则会内置该组件, 否则需要自定义,自定义示例代码如下:
java
import java.util.List;

@Configuration
public class CurrentUserInfoProviderConfig {

    @Bean
    public CurrentUserInfoProvider currentUserInfoProvider() {
        return () -> {
            CurrentUserInfo userInfo = new CurrentUserInfo();
            String loginName = "xuqiu"; // 根据上下文获取用户名
            userInfo.setLoginName(loginName);
            List<String> roleCodes = Arrays.asList("pangea3-admin"); // 根据上下文获取角色编码
            userInfo.setRoleCodes(roleCodes);
            List<String> orgCodes = Arrays.asList("ORG-001");
            userInfo.setOrgCodes(orgCodes); // 根据上下文获取组织编码
            return userInfo;
        };
    }
}

系统信息扩展

盘古3.0全面引入了多环境多租户能力,因此调用API时需要传递系统名称、环境代码、租户代码等参数, 数据权限组件的配置也提供了静态的变量配置,但是如果需要支持多环境多租户的场景时,仅通过静态变量配置的方式无法实现, 则需要通过系统信息扩展的方式ApplicationInfoProvider来动态获取系统名称、环境代码、租户代码等参数。 示例如下:

java
@Configuration
public class ApplicationInfoProviderConfig {
    @Bean
    public ApplicationInfoProvider applicationInfoProvider() {
        return new ApplicationInfoProvider() {
            // ...
        };
    }
}

数据权限放行

正常状态下,Pangea会拦截所有的查询语句并匹配相关的数据权限。如果希望Pangea放行该查询语句,需要在需要放行的方法上添加以下注解:
@IgnoreDataPermit

java
@Service
public class DemoService {
    
    //添加注解
    @IgnoreDataPermit
    public List<Demo> selectList(Demo demo) {
        // ...
    }
}

注意事项

  • Mybatis组件会自动注册数据权限的拦截器,不需要再手动调用数据权限的组件处理SQL;