自定义数据权限拦截处理

业务场景

公司给员工对哪些模块有访问权限,这个时候就需要在员工访问模块表的时候做数据过滤,

解决方案

我们可以通过平台提供的数据过滤占位符解决这个问题,新建一条数据行权限,过滤语句条件是占位符,再编写占位符的解析逻辑

1.初始化权限基础数据

package pro.shushi.pamirs.demo.core.init;

import com.google.common.collect.Lists;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import pro.shushi.pamirs.auth.api.constants.AuthConstants;
import pro.shushi.pamirs.auth.api.enmu.AuthGroupTypeEnum;
import pro.shushi.pamirs.auth.api.enmu.PermissionDataSourceEnum;
import pro.shushi.pamirs.auth.api.enmu.PermissionTypeEnum;
import pro.shushi.pamirs.auth.api.model.AuthGroup;
import pro.shushi.pamirs.auth.api.model.AuthRole;
import pro.shushi.pamirs.auth.api.model.ResourcePermission;
import pro.shushi.pamirs.boot.base.model.UeModule;
import pro.shushi.pamirs.boot.common.api.command.AppLifecycleCommand;
import pro.shushi.pamirs.boot.common.api.init.InstallDataInit;
import pro.shushi.pamirs.boot.common.api.init.UpgradeDataInit;
import pro.shushi.pamirs.demo.api.DemoModule;
import pro.shushi.pamirs.demo.core.placeholder.EmployeeModulePlaceholder;
import pro.shushi.pamirs.framework.common.utils.ObjectUtils;
import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j;
import pro.shushi.pamirs.meta.domain.module.ModuleDefinition;

import java.util.Collections;
import java.util.List;

@Slf4j
@Component
@Order(0)
public class DemoModuleBizInit implements InstallDataInit, UpgradeDataInit {

    @Override
    public List<String> modules() {
        return Collections.singletonList(DemoModule.MODULE_MODULE);
    }

    @Override
    public int priority() {
        return 0;
    }

    @Override
    public boolean init(AppLifecycleCommand command, String version) {
        this.initAuth();
        return true;
    }

    @Override
    public boolean upgrade(AppLifecycleCommand command, String version, String existVersion) {
        this.initAuth();
        return true;
    }

    private void initAuth() {
        AuthGroup authGroup = new AuthGroup();
        authGroup.setName("测试权限组")
                .setDisplayName("测试权限组")
                .setType(AuthGroupTypeEnum.RUNTIME)
                .setActive(true);
        authGroup.createOrUpdate();

        AuthRole authRole = new AuthRole();
        authRole.setCode("TEST_ROLE_1")
                .setName("测试角色")
                .setRoleTypeCode(AuthConstants.ROLE_SYSTEM_TYPE_CODE)
                .setPermissionDataSource(PermissionDataSourceEnum.CUSTOM)
                .setActive(true);
        authRole.createOrUpdate();

        authRole.setGroups(Lists.newArrayList(authGroup));
        authRole.fieldSave(AuthRole::getGroups);

        ResourcePermission authPermission = new ResourcePermission();
        authPermission.setName("测试模块权限过滤")
                .setDomainExp(EmployeeModulePlaceholder.PLACEHOLDER)
                .setModel(ModuleDefinition.MODEL_MODEL)
                .setPermRead(true)
                .setPermRun(true)
                .setPermissionType(PermissionTypeEnum.ROW)
                .setPermissionDataSource(PermissionDataSourceEnum.CUSTOM)
                .setCanShow(true)
                .setActive(true);

        ResourcePermission authPermission2 = ObjectUtils.clone(authPermission);
        authPermission2.setName("测试ue模块权限过滤").setModel(UeModule.MODEL_MODEL);

        authGroup.setPermissions(Lists.newArrayList(authPermission, authPermission2));
        authGroup.fieldSave(AuthGroup::getPermissions);
    }
}

这里演示的module表比较特殊,需要同时设置ModuleDefinitionUeModule这2个模型做数据过滤

2.编写占位符拦截替换逻辑

package pro.shushi.pamirs.demo.core.placeholder;

import org.springframework.stereotype.Component;
import pro.shushi.pamirs.user.api.AbstractPlaceHolderParser;

@Component
public class EmployeeModulePlaceholder extends AbstractPlaceHolderParser {
    public static final String PLACEHOLDER = "${employeeModulePlaceholder}";

    protected String value() {
        // TODO 可以根据业务数据动态拼写rsql条件,这里只是示例,请改成自己的查询条件
        return "module != 'hidden_module'";
    }

    public Integer priority() {
        return -this.namespace().length();
    }

    public Boolean active() {
        return true;
    }

    public String namespace() {
        return EmployeeModulePlaceholder.PLACEHOLDER;
    }
}

3.在"用户管理"应用内给用户绑定新建的角色

自定义数据权限拦截处理

4.如权限未生效,可在"权限"应用的角色管理处刷新权限

自定义数据权限拦截处理

如何通过sql语句查看配置是否生效?

修改启动工程内的application-dev.xml配置开启sql日志,将日志级别从error改成debug后重启应用

logging:
  level:
    root: info
    pro.shushi.pamirs.framework.connectors.data.mapper.GenericMapper: debug # mybatis sql日志

通过gql工具发起请求,以上面的逻辑示例

{
    moduleQuery {
        queryPage(
            page: { size: 200, currentPage: 1 }
            queryWrapper: { }
        ) {
            content {
                module
                displayName
            }
        }
    }
}
查看效果

自定义数据权限拦截处理

Oinone社区 作者:nation原创文章,如若转载,请注明出处:https://doc.oinone.top/backend/4737.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
nation的头像nation数式员工
上一篇 2023年11月23日
下一篇 2023年11月24日

相关推荐

  • 如何自定义Excel导入功能

    介绍 在平台提供的默认导入功能无法满足业务需求的时候,我们可以自定义导入功能,以满足业务中个性化的需求。 功能示例 下面以导入文件的时候加入发布人的字段作为示例讲解。 继承平台的导入任务模型,加上需要在导入的弹窗视图需要展示的字段 package pro.shushi.pamirs.demo.api.model; import pro.shushi.pami…

    2023年11月22日
    45400
  • 国际化-语言和时区设置

    国际化-翻译 1、引入翻译的包 <dependency> <groupId>pro.shushi.pamirs.core</groupId> <artifactId>pamirs-translate</artifactId> </dependency> 2、默认逻辑:在系统的右上角,切换…

    2023年12月4日
    43300
  • 【后端】项目开发后端知识要点地图

    大类 明细 文档链接 平台基础 如何开发Action,理解前后端协议 如何开发Action,理解前后端协议 CDN配置及文件操作相关 OSS(CDN)配置和文件系统的一些操作 MINIO无公网访问地址下OSS的配置 MINIO无公网访问地址下OSS的配置 分库分表与自定义分表规则 分库分表与自定义分表规则 Oinone引入搜索引擎(增强模型) Oinone引…

    2024年5月21日
    1.2K00
  • 字段类型之关系描述的特殊场景(常量关联)

    场景概述 【字段类型之关系与引用】一文中已经描述了各种关系字段的常规写法,还有一些特殊场景如:关系映射中存在常量,或者M2M中间表是大于两个字段构成。 场景描述 1、PetTalent模型增加talentType字段2、PetItem与PetTalent的多对多关系增加talentType(达人类型),3、PetItemRelPetTalent中间表维护pe…

    2024年5月25日
    89700
  • 如何发送邮箱、手机短信以及设置

    1.邮件发送 1.1 邮件服务设置 1.1.1 方法一:通过yaml文件配置 pamirs: email: smtp: smtpHost: smtp.exmail.qq.com smtpUser: xxx@xxx.com smtpPassword: xxxxxx smtpPort: 465 smtpSecurity: SSL #邮件模块可后续后台自行添加 t…

    后端 2023年11月6日
    46900

发表回复

登录后才能评论