继续完善我对数据权限的奇思妙想

思路是使用MyBatis-Plus提供的DataPermissionHandler数据权限插件,使用自定义注解@DataScope在方法上,通过切面查询该账号拥有的角色List,是否关联有的数据规则,执行SQL前进行拦截,解析拼接SQL。

例子 我们想在订单不分页接口限制某个角色只能查看收获地址中存在钦北区或者订单金额小于等于100的订单。

那么我们可以添加一个mark(我这里暂时把他叫做标记),标记这个接口为order-list

在这个标记下添加我们需要的两条规则

再给普通角色配置一下他在这个接口适用的规则,就是刚刚添加的规则

然后使用注解@DataScope("order-list")在mapper的接口上,这里我们用重写MyBatis的list()接口来测试,如下:

java 复制代码
// 建议使用在mapper方法接口上
@Mapper 
public interface OrderMapper extends BaseMapper<Order> {
    
    @DataScope("order-list")
    @Override
    List<Order> selectList(@Param(Constants.WRAPPER) Wrapper<Order> queryWrapper);
    
}


// 用在service层方法上时,要注意调用的方法是否是本类的方法
// 如果是,会导致代理失败,数据权限失效
@Service
public class OrderServiceImpl extends EntityServiceImpl<OrderMapper, Order, OrderDto, OrderQuery> implements OrderService {
    
    @Override
    public List<OrderDto> list(OrderQuery query) {
        LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StrUtil.isNotBlank(query.getReceiverName()), Order::getReceiverName, query.getReceiverName());
        // ...其他条件
        return afterQueryHandler(list(queryWrapper), new BOrderQueryHandler());
    }
    
}

在查询调用OrderServiceImpl#list(OrderQuery query)方法时,原本的sql为 SELECT * FROM ex_order WHERE deleted=0

经过数据权限处理后则为 SELECT * FROM ex_order WHERE deleted = 0 AND (order_amount <= 100 OR receiver_address LIKE '%钦北区%')

从而实现了数据权限的控制。

当然这只是简单需求,复杂的需求也提供了解决办法:规则处可以配置全限定类名加方法,可以带参,解析规则时会反射执行该方法得到返回值,该功能可以实现复杂的数据权限需求,就看你怎么搭配。

例如:查看订单金额为整数且为偶数的订单

java 复制代码
// 太变态了,方法名都不知道怎么起了
private List<Long> getLimitOrderId() {
    // 查出订单进行过滤然后返回能看的订单idList
    return idList;
}

wonder-server: 一个灵活的数据权限管理 (gitee.com) 欢迎来指点指点

相关推荐
狂放不羁霸17 分钟前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
九圣残炎18 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge20 分钟前
Netty篇(入门编程)
java·linux·服务器
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言