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

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

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

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

image-20231205112116030

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

image-20231205112231485

image-20231205112244807

image-20231205112253529

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

image-20231205112841923

然后使用注解@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 '%钦北区%')

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

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

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

image.png

 

java

复制代码

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

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

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常感谢您的提问。我很高兴为您提供一篇关于奇思妙想的作文。 奇思妙想是一种非常有趣的思维方式,它可以帮助我们在日常生活中发现新的可能性和解决问题的方法。有时候,我们会发现自己陷入了一种思维定势,无法从中走出来。但是,如果我们能够运用奇思妙想的思维方式,就可以打破这种定势,找到新的思路。 奇思妙想的思维方式有很多种,比如说反向思考、联想思维、模拟思维等等。其中,反向思考是一种非常有趣的思维方式。它的基本思路是,不要从正常的思路出发,而是从相反的方向出发,想象一下如果事情完全相反会怎样。比如说,如果我们想要设计一款新的手机,我们可以从反向思考的角度出发,想象一下如果手机不需要电池会怎样,或者如果手机可以自动充电会怎样。 联想思维也是一种非常有趣的思维方式。它的基本思路是,将不同的事物联系起来,从而产生新的想法。比如说,如果我们想要设计一款新的汽车,我们可以从联想思维的角度出发,想象一下如果汽车可以像飞机一样飞行会怎样,或者如果汽车可以像船一样在水上行驶会怎样。 模拟思维也是一种非常有趣的思维方式。它的基本思路是,通过模拟现实情境,来寻找新的解决方案。比如说,如果我们想要设计一款新的游戏,我们可以从模拟思维的角度出发,想象一下如果我们自己是游戏中的角色会怎样,或者如果游戏可以在现实中进行会怎样。 总之,奇思妙想是一种非常有趣的思维方式,它可以帮助我们在日常生活中发现新的可能性和解决问题的方法。如果我们能够运用奇思妙想的思维方式,就可以打破思维定势,找到新的思路,创造出更加有趣和创新的事物。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值