| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【清晨平台记录六】代码实现平台后台用户模块四(主要实现操作权限、数据权限的过滤) -> 正文阅读 |
|
[Java知识库]【清晨平台记录六】代码实现平台后台用户模块四(主要实现操作权限、数据权限的过滤) |
上一篇地址:【清晨平台记录五】代码实现平台后台用户模块三(主要实现登录账号信息、操作权限内容) 本篇代码地址:Gitee 地址 注意是 project06 分支哦 接口文档地址:Apifox工具编写的接口文档 目录 5.用户模块—研发思路5.2子模块研发5.2.7操作权限、数据权限1.操作权限操作权限从设计的角度来说,就是用户使用系统时,能够展示并使用哪些导航栏、页面、按钮。
第一种有一个问题,用户正常使用时不会出现问题,但是如果有用户了解平台的接口调用规则,直接调用接口(通过Apifox等),就可以直接无权限访问!这是不可以的,所以建议后端一定要做操作权限判断! 而我们使用 springSecurity 工具框架,他就为我们提供了这样的工具,我们直接使用就可以,灵活又方便~~~ 我们主要是用 springSecurity 的权限注解,自定义调用权限校验的方式 :@PreAuthorize("@serviceBeanName.hasPermi('system:user:list')") 这个注解是添加到接口方法上的,当接口被访问时,会先调用 bean 名字为?serviceBeanName 的 .hasPermi(参数) 的方法,方法的返回值是?boolean ,如果是 true 则表示权限校验通过,如果是 false 则表示权限校验失败 。 也就是说,我们需要提前获取到当前用户都有哪些权限(即权限标识)集合,然后写一个验证权限的service业务类,需要将当前访问接口需要的权限作为入参传进来,然后判断入参在不在权限集合里面,若在则返回true,不择则返回false,最后再将这个注解添加到需要验证权限的接口方法上面~ 开始码代码:
测试之前,我们需要搭建一下测试数据~ 首先需要完整的 sys_menu 表数据,然后创建角色,并给角色选择性绑定菜单权限,然后给用户绑定角色。 可以测试没有这个权限的用户访问结果,和有这个权限的用户访问结果来对比: 这是没有权限时的访问 2.数据权限操作权限从设计的角度来说,就是用户使用系统时,如果打开了一个列表的页面,那么会根据他的对于这个列表的数据范围获取到的相应的创建的数据。 对于设计而言,每个角色对应一个菜单权限和数据权限,数据权限只针对于当前角色里面的菜单权限。如果一个用户有多个角色,角色里面的菜单权限有重复的,那么这些重复的菜单的数据权限按照并集处理(也就是按照最大的范围获取)。 数据权限范围有大到小为:1.全部,2.自定义用户组,3.当前用户组,4.当前用户组及其子用户组,5.仅自己。
也就是说,当我们获取需要区分数据范围的列表数据时,我们先给菜单类型的数据一个标识,当我们访问这个菜单对应的列表查询的业务层时,先根据这个菜单标识,查询用户绑定的角色中,哪些角色有这个菜单权限,然后从这些角色中获取一个范围最大的数据范围,根据这个范围去获取数据~
我们使用切面编程来实现数据权限,这样就不会影响到方法内部的逻辑了,我们想要给某个方法加上这个逻辑,就直接定位到这个方法就行了。定位方法我们用注解的方式,这样直接给方法加上注解就行啦! 再一个,我们拼接了mybatis 动态查询的语句后,需要传给 mapper ,我们就需要从切面类回传给service,可以通过反向代理拿到业务方法的入参,然后将动态语句传给入参,这样业务方法就能够获取到动态语句啦!这样我们就需要给业务方法添加一个入参,专门存放动态语句,这样就可能就需要给所有需要判断数据权限的方法都加上入参,破坏性太大! 通常情况,我们查询时都会传当前类型的实体类,那么我们就可以将动态接收的语句存到每个实体类里面,也就是实体基类! 开始码代码:
准备测试数据: 首先我们需要 6 个角色,其中 5 个角色都有 “system:usergroup:list”的菜单权限,并且数据范围是从全部到仅自己,角色名用1-5表示;最后一个角色不包含 “system:usergroup:list”的菜单权限,数据范围随机(例如全部),角色名用 6 表示 然后,我们创建 6 个用户,并且将用户的创建人分别设置为自己。然后再创建 5 个用户组,并给他们分别绑定用户。就像下面的结构: - 用户组1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 绑定用户:yonghu1 ????????- 用户组11? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 绑定用户:yonghu11 、yonghu110 ????????????????- 用户组111????????????????????????????????????绑定用户y:yonghu111 ????????- 用户组12?????????????????????????????????????????????绑定用户:yonghu12 - 用户组2????????????????????????????????????????????????????????绑定用户:yonghu2 最后,我们给角色 2 绑定 用户组1、用户组12、用户组111? 三个用户组。 【以上数据都是同一个用户名下的哦~】
我们使用 yonghu11 账号进行获取用户列表测试,按照下面的测试:
完成~ 后续的模块~~5.2.8列表分页 5.2.9角色模块添加操作用户的逻辑 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:00:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |