Shiro实现多级权限的分页查询
✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
这里有:
- 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
- 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
- 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!
👉 点击直达→
👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~
目录
欢迎来到 盹猫(>^ω^<)的博客
本篇文章主要介绍了
[Shiro实现多级权限的分页查询]
❤博主广交技术好友,喜欢文章的可以关注一下❤
一、简介
当我们使用SpringBoot配合Shiro完成权限验证时,我们知道需要通过在接口(Controller)上添加@RequiresPermissions("sys:user:page") 注解实现来实现用户具有某个接口权限的访问证明,这中注解在实际应用中只能控制用户访问接口的权限,却不能控制用户访问的数据,如:管理员拥有上述权限,下级的管理员(镇或街道)管理员拥有查看管辖街道(镇)内的权限。这时,只使用该注解是无法知道用户可以访问的是全部还是部分数据了,本文就是记录如何在这种情况下细分用户权限的。
二、分析
1.代码内设置条件
其实很容易想到,我们需要在shiro认证时获取用户用户所在的管辖权限(街道ID、镇街ID),并通过在分页或列表接口中增加镇街ID、街道ID数据过滤条件,来保证用户只能查看自己管辖范围内的数据。
如上述实现,通过获取认证用户的街道ID并附带在查询条件中实现在后续的数据过滤操作。
但这样实现会产生一个新的问题,假如项目接口非常多,有非常多的分页 、列表的类似的权限过滤操作,这时使用上述方式会带来接口文件很多重复性的编码(即设置过滤条件),而且Mapper文件(这里使用Mybatis举例,也可以是其它框架)也会有很多重复性编码(即使用过滤条件)。
2.方法切面
为解决上述重复设置、使用过滤条件问题,需要用到自定义的注解并实现AOP界面类来实现这些重复性代码操作。
首先创建一个SegmentedRole 标记为注解,内容如下:
SegmentedRole.java
该类中的tableAlias方法即要查询表的简写,即在Mapper文件中使用的查询简写,如:tb_student简写为ts.
然后对该注解进行自定义的实现,创建一个SegmentedAspect 类,该类为该注解方法的主要实现类,内容如下:
SegmentedAspect.java
主要的实现为
这里将用户的所在市区、镇街、街道信息添加到Map中并通过后续的mybatis拦截器进行sql注入操作。
DataFilterInterceptor.java
过滤器的主要作用是对查询上面添加到查询map中的sql与查询的SQL在查询前进行组装,封装为新SQL。
这样在代码中的设置条件就可以转换为在分页、列表接口上添加SegmentedRole 注解,使用方法如下:
这样在后续的数据库查询中就会自动拼接SQL以实现接口的数据过滤了。
如果你对区块链内容感兴趣可以查看我的专栏:
感谢您的关注和收藏!!!!!!
- 点赞
- 收藏
- 关注作者
评论(0)