若依@DataScope

@DataScope : 根据sys_role 中的 data_scope中的值,来设置数据该怎么过滤,,

data_scope 取值:

  • 1 : 不需要过滤
  • 2 : 自定义过滤 : 根据 sys_role_dept 这个表关联出来的 dept_id 过滤
  • 3 : 只显示当前所在部门 : 根据sys_user表中的 dept_id 。。当前user所属的部门过滤
  • 4: 显示当前所在部门以及他的子部门: 根据 sys_user中的dept_id ,在sys_dept中找到他和他的子部门
  • 5: 不让查看部门数据 : 只能查看自己的数据,,,可以关联 sys_user表,并设置 user表的id过滤

@DataScope 会定义两个值 ,, 第一个是 deptAlias ,,部门表的别名。。。 userAlias : user表的别名

怎么过滤的:
根据当前登录的用户的角色,,遍历每个角色的data_scope 属性,,根据这个属性,拼接sql,,,
每一次查询都会去关联 sys_dept这个表,,如果你查找的这个表,,没有和 sys_dept 直接关联的属性,,那么就需要关联 sys_user 表,,因为 sys_user 表中有dept_id 可以根据dept_id过滤数据,
不管怎么关联,,最后都会去 关联 sys_dept 并且 将查出来的部门id,,和当前用户能操作的部门,进行过滤,,, 查出来的dept_id 在当前用户能操作的部门中,,就显示

拼接的SQL:

# xxx: 代表每一个角色能操作的部门
select * from 表名 where 条件  and dept_id in (xxx   OR  xxx OR xxx)

代码:

/*** 根据当前用户的 role ,, 去查对应的部门,,如果你找的那个表有 dept_id 就根据那个表的 dept_id 过滤* 如果你找的那个表没有dept_id,,就需要关联user表,,根据user表上的dept_id过滤,,就需要关联user表,,给user表取别名,,比如查找sys_role的时候* @Date 2023/7/8 19:42* @Author cc*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataScope {/*** 部门表的  别名*/String deptAlias()  default "";/*** user 表的  别名*/String userAlias() default "";
}
/*** 动态权限控制   : 根据数据库中 sys_role中的 data_scope的值,来动态权限*   1: 不设置权限控制*   2:  自定义权限:  根据数据库连表查出来的权限,,在sys_role_dept  中*   3:  只能查自己的部门,,  在sys_user中有自己的部门字段*   4:  不仅可以查看自己的,,还可以查看自己的子部门,,, 在 sys_dept中找出 自己部门和子部门*   5:  不能查看部门,,,只能看自己的数据**   遍历角色,,根据 sys_role 判断每个角色具有的 data_scope ,拼接成 sql,* @Date 2023/7/8 19:45* @Author cc*/
@Component
@Aspect
public 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";// BaseEntity中的params Map  中 拼接sql的keypublic static final String DATA_SCOPE = "data_scope";/*** 前置通知,,,在查询之前给  BaseEntity中的params 添加 sql 过滤*/@Before("@annotation(dataScope)")public void before(JoinPoint joinPoint, DataScope dataScope){// 这个 params 可能是前端传递的MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 前端传递的是 继承BaseEntity的对象,,并且只有一个参数Object arg = joinPoint.getArgs()[0];System.out.println("arg"+arg);if (arg != null && arg instanceof BaseEntity){BaseEntity baseEntity = (BaseEntity) arg;baseEntity.getParams().put(DATA_SCOPE,"");}// 获取当前用户信息User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();// 判断是不是adminif (user.getUserId() == 1L){// 不用过滤return;}/***         select * from table_name  where  ... and (xxx or  xxx or xxx)**         xxx: 每个role限制的条件*/StringBuilder sql = new StringBuilder();List<Role> roleList = user.getRoleList();for (Role role : roleList) {// 根据角色,生成查询的sql//  每个角色对应的权限是不一样的,,// 获取角色对应的数据权限String ds = role.getDataScope();if (DATA_SCOPE_ALL.equals(ds)){// 查看所有数据return;}else if (DATA_SCOPE_CUSTOM.equals(ds)){// 自定义数据权限  :  根据用户角色查找部门idsql.append(String.format(" OR  %s.dept_id in (select d.dept_id from sys_dept d,sys_role_dept rd where d.dept_id = rd.dept_id and rd.role_id =%d)",dataScope.deptAlias(),role.getRoleId()));}else if (DATA_SCOPE_DEPT.equals(ds)){// 自己当前部门sql.append(String.format(" OR %s.dept_id = %d",dataScope.deptAlias(),user.getDeptId()));}else if (DATA_SCOPE_DEPT_AND_CHILD.equals(ds)){// 自己部门和子部门sql.append(String.format(" OR %s.dept_id in (select d.dept_id from sys_dept d where d.dept_id = %d or find_in_set(%d,ancestors))",dataScope.deptAlias(),user.getDeptId(),user.getDeptId()));}else if(DATA_SCOPE_SELF.equals(ds)){// 看他传没有传 userAlias  。。 如果传了,表示那个表关联了 user表,,查找当前user表对应 userId 的数据,,如果没有 userAlias 表示没有连接 user表,// 没有部门权限,只能看自己的数据,,不能看部门数据String s = dataScope.userAlias();if ("".equals(s)){// 没有连接 user表sql.append(String.format(" OR %s.dept_id in (1=0)",dataScope.deptAlias()));}else{// 连接了 user表sql.append(String.format(" OR  %s.user_id= %d",dataScope.userAlias(),user.getUserId()));}}// 拼接 sql    and (xxx OR  xxx OR xxx)if (arg != null && arg instanceof BaseEntity){BaseEntity baseEntity = (BaseEntity) arg;baseEntity.getParams().put(DATA_SCOPE,"AND( "+ sql.substring(4) +" )");}}}
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数指针数组的概念和应用

函数指针数组 是什么&#xff1f; 函数指数组是存放函数指针的数组 int Add(int x, int y) {return x y; }int Sub(int x, int y) {return x - y; }int Mul(int x, int y) {return x * y; }int Div(int x, int y) {return x / y; }int main() {int(*parr[4])(int, int) { …

Ubuntu 20.04 LTS 安装 nvidia 驱动 + cuda 11.8 从开始到放弃!

升级 sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restri…

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测

回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 回归预测 | MATLAB实现WOA-DNN鲸鱼算法优化深度…

什么是Qt Widgets?一组创建经典桌面应用UI的界面组件!

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 Qt Widgets模块提供…

spring-依赖注入的方式

setter注入-可选依赖注入 简单类型&#xff1a; 1.配置类 2.set方法 引用类型&#xff1a; 构造器注入-强制依赖注入 简单类型&#xff1a; 引用类型&#xff1a; 通过有参构造&#xff0c;获得需要注入的对象 <construct-arg />标签中name属性中填写的时构造方…

Linux--进程

什么叫做进程&#xff1f; 程序加载到内存就叫进程&#xff08;看不懂是吧&#xff0c;看下面更详细一些&#xff09; 进程对应的代码和数据进程对应的PCB结构体

Stable Diffusion系列课程上:安装、提示词入门、常用模型(checkpoint、embedding、LORA)、放大算法、局部重绘、常用插件

文章目录 一、Stable Diffusion简介与安装二、文生图&#xff08;提示词解析&#xff09;2.1 提示词入门2.2 权重2.3 负面提示词&#xff08; Negative prompt&#xff09;2.4 出图参数设置2.5 新手念咒方法 三、图生图3.1 图生图入门3.2 随机种子解析3.3 图生图拓展 四、模型4…

【C++进阶】bitset位图介绍以及模拟实现

文章目录 位图介绍一、位图的引入二、位图的概念 位图模拟实现一、构造函数二、set&#xff0c;reset&#xff0c;test函数三、代码测试四、完整代码 位图介绍 一、位图的引入 先来看下边一道面试题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符…

基于SpringBoot+Vue的影城管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

目录 一、对 Docker 的理解 1、Docker 基本概念 2、Docker 与 虚拟机的区别 3、何为镜像和容器&#xff1f; 4、Docker 主要架构 二、Docker 基本操作 1、Docker 镜像操作 2、案例&#xff08;镜像&#xff09;&#xff1a;去 DockerHub 搜索并拉取一个 Nginx 镜像&am…

Python数据分析常见Matplotlib SeaBorn图表

Matplotlib绘图 Matplotlib基本概念 Matplotlib&#xff1a;基于对象的思维构建的视觉符号。 每一个Axes&#xff08;坐标轴&#xff09;对象包含一个或者多个Axis(轴)对象&#xff0c;比如X轴、Y轴。 一个Figure&#xff08;画像&#xff09;是由一堆坐标轴对象组成的。 换…

scanpy sc.pp.normalize_per_cell bug

今天遇到一个很奇怪的bug, 当今天跑covid_atlas数据集的时候&#xff0c;在123服务器总是报错&#xff0c;但是我记得在122服务器上是跑过没问题的 最终的测试结果如下 import scanpy as sc import numpy as np from QUEST import QUEST from QUEST.utils import get_free_…