2022年3月16日 作者 zeroheart

数据权限实现的一种思路

参考这个框架:自定义注解 | Zjmzxfzhl (gitee.io)

一.组织结构的形式过滤数据

大概写一下里面的逻辑,关键的代码

1.默认的实现

OrgDataPermissionProvider

2. OrgDataPermissionProvider中的三种类型

public PermissionWrapper wrap(PermissionWrapper permissionWrapper) {
        SecurityUser securityUser = (SecurityUser)SecurityUtils.getUserDetails();
        CommonUtil.isEmptyMapWithKey(securityUser.getAdditionalInformation(), "orgLevelCode", "orgLevelCode is null");
        String orgId = securityUser.getOrgId();
        String orgLevelCode = securityUser.getAdditionalInformation().get("orgLevelCode").toString();
        String alias = (String)CommonUtil.isEmptyDefault(this.alias, "o");
        SqlFilter.sqlInject(alias);
        String type = (String)CommonUtil.isEmptyDefault(this.type, "1");
        if ("1".equals(type)) {
            permissionWrapper.likeRight(alias, "ORG_LEVEL_CODE", orgLevelCode);
        } else if ("2".equals(type)) {
            permissionWrapper.eq(alias, "ORG_ID", orgId);
        } else if ("3".equals(type)) {
            ((PermissionWrapper)permissionWrapper.likeRight(alias, "ORG_LEVEL_CODE", orgLevelCode)).ne(alias, "ORG_ID", orgId);
        }

        return permissionWrapper;
    }

2.1 permissionWrapper.likeRight(alias, “ORG_LEVEL_CODE”, orgLevelCode);

可以查询本部门以及下属部门的数据

2.2 permissionWrapper.eq(alias, “ORG_ID”, orgId);

可以查询本部门的数据

2.3((PermissionWrapper)permissionWrapper.likeRight(alias, “ORG_LEVEL_CODE”, orgLevelCode)).ne(alias, “ORG_ID”, orgId);

可以查询下属部门的数据,但是查不了本部门的数据

以上三种感觉以及可以覆盖基本的使用场景了,是以组织结构的形式来过滤数据的。

二.动态条件的形式过滤数据

1.指定方法、对象、表字段,条件

2.最终结果就是,某个controller方法,在xx对象(角色或者用户)下,这个方法的sql中对table按照字段xxx的录入条件进行过滤。以上例子,对于角色queryRole的用户调用方法,就会限制

AND (a.FILTER_OPERATOR_NE <> '1')

具体的代码可以参考

com.zjmzxfzhl.common.core.config.mybatis.permission.PermissionParser

我看了下以上代码,对于查询条件好像是不支持sql语句的,只能是常量。这块也可以按照自己的需求来扩展。

以上两种形式是可以一起生效的。