最新要闻
- 800W功耗!RTX 4090 Ti四插槽"核弹"真的有 但不一定能生出来
- 全球微速讯:《最后生还者》剧集第3集与游戏对比 还原度高
- 实时焦点:摩托骑手广东高速上恶意损坏其他车辆 官方回应:一刀切禁摩很好?
- 每日短讯:12.4万买新帕纳梅拉!近600名国内网友保时捷官网疯抢:成功下单后被取消
- 【全球时快讯】奔驰获全球首家L3级自动驾驶认证:开车不用看路 出事故奔驰负责
- 【快播报】优酷回应1元会员被扣24元争议:活动规则已告知 扣钱没毛病
- 当前热文:水墨风场景惊艳!《仙剑奇侠传7》DLC《人间如梦》官宣2月发售
- 彻底扑灭一台特斯拉Model S有多难 消防员实测:用了22.7吨水
- 【环球播资讯】小鹏股价暴跌、交付量惨淡 何小鹏专访回应:未来会这么做
- 全球动态:全球首个!婴幼儿视功能损伤手机智能筛查系统面世
- 撸猫手感 绿联iPhone 12-14系列液态硅胶保护壳9.9元起
- 天天快看点丨海淘不香了!日版Xbox主机涨价将近260元
- 天天速递!全国首烧?疑似红旗E-HS9充电时起火 现场黑烟弥漫
- 瑾娘为什么要杀华裳?瑾娘为什么假扮巽芳?
- 爱在旅途大结局是什么?爱在旅途剧情介绍
- 法国属于西欧还是北欧?南欧包括哪些国家?
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
聚焦:一步一步实现若依框架--2.4数据权限 data_scope
@DataScope(deptAlias = "d", userAlias = "u")public ListselectUserList(SysUser user){ return userMapper.selectUserList(user);}
修改角色表中的data_scope字段,进行各种数据权限的设置。由于spring security会将用户的角色信息存起来,需要用户重新登陆。
不能用admin用户测试测试结果:
(资料图片仅供参考)
DATA_SCOPE_ALL 全部数据权限
SELECT count(0) FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id WHERE u.del_flag = "0"
DATA_SCOPE_CUSTOM 自定义数据权限
SELECT count(0) FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id WHERE u.del_flag = "0" AND (d.dept_id IN (SELECT dept_id FROM sys_role_dept WHERE role_id = 2))
去关联了表sys_role_dept去查询当前角色和部门的对应关系,在系统中对应的操作界面是
DATA_SCOPE_DEPT 部门数据权限
SELECT count(0) FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id WHERE u.del_flag = "0" AND (d.dept_id = 101)
DATA_SCOPE_DEPT_AND_CHILD 部门及以下数据权限
SELECT count(0) FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id WHERE u.del_flag = "0" AND (d.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = 101 OR find_in_set(101, ancestors)))
DATA_SCOPE_SELF 仅本人数据权限
SELECT count(0) FROM sys_user u LEFT JOIN sys_dept d ON u.dept_id = d.dept_id WHERE u.del_flag = "0" AND (u.user_id = 3)
2、原理
根据测试结果,数据权限的控制就是根据部门或者人员信息来进行的,也就是说,想要进行数据权限过滤的数据必须包含部门编号dept_id或者人员编号user_id。根据系统总结的5种数据类型,生成sql语句,通过在mybatis中添加${params.dataScope}把生成的sql语句拼接到原sql里。
3、实现注解+AOP
a、需要使用到的数据表:sys_user\sys_role\sys_user_role\sys_dept\sys_role_dept。 b、这里要能保证用户能登陆并且能获取到自己的角色信息,权限后面会单独说这里只进行了简单处理能满足当前使用。权限方面的处理,sysuser实现了UserDetails接口;新增了UserDetailServiceImpl实现了UserDetailsService;提供了pssswordEncoder密码工具。 c、给请求参数,拼接params参数(通过继承baseEntity实现),把拼接号的sql通过params的字段dataScope传入到mybatis的xml中,实现了拼接sql。核心的切面处理方法就是在根据数据权限类型,来拼接sql,传递sql参数。@Aspect@Componentpublic class DataScopeAspect { /** * 全部数据权限 */ public static final String DATA_SCOPE_ALL = "1"; /** * 自定数据权限 */ public static final String DATA_SCOPE_CUSTOM = "2"; /** * 部门数据权限 */ public static final String DATA_SCOPE_DEPT = "3"; /** * 部门及以下数据权限 */ public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; /** * 仅本人数据权限 */ public static final String DATA_SCOPE_SELF = "5"; public static final String DATA_SCOPE = "dataScope"; @Before("@annotation(controllerDataScope)") public void doBefore(JoinPoint point, DataScope controllerDataScope) { clearDataScope(point); handleDataScope(point, controllerDataScope); } private void handleDataScope(JoinPoint point, DataScope controllerDataScope) { // 获取用户 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); SysUser currentUser = (SysUser) authentication.getPrincipal(); if(currentUser!=null && !currentUser.isAdmin()){ dataScopeFilter(point, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias()); } } private void dataScopeFilter(JoinPoint point, SysUser currentUser, String deptAlias, String userAlias) { StringBuilder sqlString = new StringBuilder(); // 考虑多个角色的数据权限可能重复的情况 Listconditions = new ArrayList (); for (SysRole role : currentUser.getRoles()) { String dataScope = role.getDataScope(); if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) { continue; } if (DATA_SCOPE_ALL.equals(dataScope)) { sqlString = new StringBuilder(); break; } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { sqlString.append(StrUtil.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId())); } else if (DATA_SCOPE_DEPT.equals(dataScope)) { sqlString.append(StrUtil.format(" OR {}.dept_id = {} ", deptAlias, currentUser.getDeptId())); } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { sqlString.append(StrUtil.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, currentUser.getDeptId(), currentUser.getDeptId())); } else if (DATA_SCOPE_SELF.equals(dataScope)) { if (StrUtil.isNotBlank(userAlias)) { sqlString.append(StrUtil.format(" OR {}.user_id = {} ", userAlias, currentUser.getUserId())); } else { // 数据权限为仅本人且没有userAlias别名不查询任何数据 sqlString.append(StrUtil.format(" OR {}.dept_id = 0 ", deptAlias)); } } conditions.add(dataScope); } if (StrUtil.isNotBlank(sqlString.toString())) { Object params = point.getArgs()[0]; if (params!=null && params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); } } } /** * 因为这个参数是后台拼接出来的,在接受到参数的时候先清除了由后台生成 * 避免参数注入 * * @param point */ private void clearDataScope(final JoinPoint point) { Object params = point.getArgs()[0]; if (params != null && params instanceof BaseEntity) { BaseEntity base = (BaseEntity) params; base.getParams().put(DATA_SCOPE,""); } }}
4、测试
@RestController@RequestMapping("/system/user")public class SysUserController { @Autowired private ISysUserService userService; @GetMapping("/list") public AjaxResult list(SysUser user) { Listlist = userService.selectUserList(user); AjaxResult ajax = AjaxResult.success(); ajax.put("list",list); return ajax; }}
@Override@DataScope(deptAlias = "d", userAlias = "u")public Listspringsecurity默认的认证模式formloggin,这里要在页面上进行登陆,然后请求:http://localhost:8080/system/user/list。同样修改sys_role的data_scope值后,需要重新访问登陆页面进行登陆。selectUserList(SysUser user){ return mapper.selectUserList(user);}
5、总结
数据权限过滤其实可能平常业务代码中通过写死sql的方式实现过,若依的这种实现和业务关联的比较紧密,还需要请求参数继承BaseEntity,使用场景上应该尽量少用。-
聚焦:一步一步实现若依框架--2.4数据权限 data_scope
1、点击若依的系统用户管理页面,测试各种数据权限生成的sql,若依调用的后台方法是:@DataScope(deptAl...
来源: 聚焦:一步一步实现若依框架--2.4数据权限 data_scope
800W功耗!RTX 4090 Ti四插槽"核弹"真的有 但不一定能生出来
全球微速讯:《最后生还者》剧集第3集与游戏对比 还原度高
实时焦点:摩托骑手广东高速上恶意损坏其他车辆 官方回应:一刀切禁摩很好?
天天观察:云萌 V2.6.3.0 win10,win11 Windows永久激活工具
热推荐:基于Spring Cache实现Caffeine、jimDB多级缓存实战
portswigger 靶场之 XSS 篇 (下)
全球最新:【算法训练营day32】LeetCode122. 买卖股票的最佳时机II LeetCode55. 跳跃游戏 LeetCode45. 跳跃游戏II
部署Kubernetes Cluster
每日短讯:12.4万买新帕纳梅拉!近600名国内网友保时捷官网疯抢:成功下单后被取消
【全球时快讯】奔驰获全球首家L3级自动驾驶认证:开车不用看路 出事故奔驰负责
【快播报】优酷回应1元会员被扣24元争议:活动规则已告知 扣钱没毛病
当前热文:水墨风场景惊艳!《仙剑奇侠传7》DLC《人间如梦》官宣2月发售
彻底扑灭一台特斯拉Model S有多难 消防员实测:用了22.7吨水
天天快消息!Android 软键盘丝滑切换(一)
天天看点:视频发布失败原因不好找?火山引擎数智平台这款产品能帮忙
速看:OpenYurt v1.2 新版本深度解读(一): 聚焦边云网络优化
【环球播资讯】小鹏股价暴跌、交付量惨淡 何小鹏专访回应:未来会这么做
全球动态:全球首个!婴幼儿视功能损伤手机智能筛查系统面世
撸猫手感 绿联iPhone 12-14系列液态硅胶保护壳9.9元起
天天快看点丨海淘不香了!日版Xbox主机涨价将近260元
天天速递!全国首烧?疑似红旗E-HS9充电时起火 现场黑烟弥漫
瑾娘为什么要杀华裳?瑾娘为什么假扮巽芳?
爱在旅途大结局是什么?爱在旅途剧情介绍
法国属于西欧还是北欧?南欧包括哪些国家?
荷兰为什么被称为水之国?荷兰水之国的资料简介
长宽高的英文缩写分别是什么?长宽高怎么算平方?
oppor7手机版本低怎么升级?oppo r7手机参数
复工第一天:请马上卸载这个恶心的软件!!!
全球看热讯:python-paramiko操作的封装
无法定位序数是什么意思?无法定位序数怎么解决?
打印机驱动在电脑哪里找?如何卸载打印机驱动?
无线适配器或访问点有问题是什么意思?无线适配器或访问点有问题怎么处理?
魅族手机怎么样?魅族手机锁屏密码忘了怎么解开?
环球速讯:工信部明天起优化调整微波频率 为5G/6G预留频谱资源
【独家】美国下手真狠!沃尔沃在美被罚8.7亿元 史上最大
快消息!APP竟比线下贵一倍还多 有电影院劝说观众退订淘票票
【世界快播报】提车1周 一特斯拉高速上行驶时方向盘脱落:维修还被收费
每日速读!全球最大游戏展E3辉煌不在:微软索尼任天堂“御三家”将集体缺席
波司登云原生微服务治理探索
今日热门!元宵节将至!元宵夜将出现年度最小满月
世界实时:侄子出演叔叔 MJ传记片年内开拍
【速看料】女子抱娃人肉占车位 还移走路障为自家车开路 结局引人舒适
世界讯息:西安阿房宫站将更名西安西站:原西站不够西
天天观热点:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元大促
焦点要闻:读Java8函数式编程笔记06_Lambda表达式编写并发程序
【全球新要闻】全网影视免费看,最新电影、电视剧免广告免VIP观看,只要你能搜到的,统统都能看,《狂飙》、《三体》追剧神器,时刻掌握最新剧集,无需安装,使用简单,
被苹果踢出供应链两年了 欧菲光仍未缓过劲:2022巨亏40多亿
精选!疯狂玩梗!强盛集团孙红雷直播被买鱼刷屏
焦点短讯!A卡很难追 游戏开发者越来越喜欢DLSS:理由离谱 弥补D加密损失
环球即时看!2023春节档爆发:复苏满座与极端的粉黑大战
每日消息!关于桌面上一万多个图标
刘慈欣:30年前拍不成《流浪地球2》 投资人不信中国有太空电梯
世界快看:老外幸福感暴降:英国近半年轻人担心收入永远不够养家
别贪速度快!SSD选什么接口更适合你?
《敢死队2》观后感
环球快报:VUEX 使用学习六 : modules
国产奋起!26557款软件力挺飞腾CPU
最新资讯:三大航空公司2022年合计预亏逾1000亿元!三大因素、东航最惨
环球观察:三亚凤凰机场出现滚滚浓烟?机场回应:暂无影响
快消息!这次过年 网吧终于活过来了!和以前完全不一样
河南矿山回应3名员工各领500万奖金:有人销售额超3亿
【环球报资讯】每个前端程序员都应该知道的10个Chrome扩展
刘慈欣:电影《流浪地球2》是原创而非小说改编 全方位超越第一部
今日聚焦!广东一男子打球6天后发现头顶卡对手2颗牙:网友神评论
焦点热议:索尼真有你的:背后给微软捅刀子
Acw 170.加成序列
精彩看点:React组件的使用
【全球独家】理想L5车型首次公布:不是SUV 价格坚守20万以上
每日热讯!最新显卡天梯榜公布:前十NVIDIA占五席!RTX 4090断层第一
全球新动态:杭州岳庙秦桧像被砸烂9次 游客仍不解气:专家称泄愤不应暴力
世界资讯:腾讯游戏春节7天吸金超4.5亿:《王者荣耀》独占一半 稳坐第一
世界信息:一加平板来了:Star Orbit金属打造 CNC一体机身
佳能2022年营收破4万亿日元 相机收入暴增 完全不惧手机蚕食
画面有点上头!男子扛铁板狂砸秦桧雕像:《满江红》带火景区热度
赚了!科学家在南极发现罕见大陨石:7.7公斤
全球消息!【Python】爬虫实战-基于代理池的高并发爬虫
焦点快看:rust写一个im聊天服务
全球看点:打破日本垄断!OLED关键材料FMM首次国产
环球今日讯!R星今日正式入驻B站!网友“花式”催更《GTA6》
全球观天下!显卡、主板返修排行:戴尔居然完美第一!AMD极度尴尬
环球简讯:神舟十五号航天员准备首次出舱!期待“感觉良好”
天天资讯:真我GT Neo5明天官宣 网友:赢麻了
每日视点!国产PCIe 4.0硬盘天花板 致态TiPro7000 1TB到手699元
《流浪地球2》热映 张朝阳称引力弹弓真实存在:美国航天器经历过
全球视点!比亚迪2022年业绩预告出炉:净利润同比暴增超450%
世界今热点:65寸电视不到2000元 LCD跌成白菜价 面板一哥京东方2022利润大跌70%
荣耀Magic5系列定档:2月27日MWC巴塞罗那见
Java中23种设计模式介绍和应用场景总结
今头条!手机测试之-adb
环球时讯:《鹅鸭杀》爆火,一文带你了解如何实现顶流社交游戏
DevOps: 自动与手动部署语义化版本(Semantic Versioning)实操
焦点信息:手上有了这些工具,明天争取6点下班了!
全球焦点!平价神器!新iPad mini 7曝光:处理器/屏幕惊喜
女子买电影票发现仅一个普通座位 其他全是C位 工作人员也无语
每日短讯:他真的很忙!雷军站公司门口给小米员工挨个发红包
最资讯丨打工人热议今天怎么才是周一:专家科普节后综合征
【全球热闻】《无名》折戟春节档:4.9亿票房只排第4、粉黑大战尴尬
springboot整合activiti实现流程审批(支持单体、微服务融合)
环球百事通!FPGA用ROM输出正弦波