若依@DataScope

news2024/9/19 10:53:13

@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的key
    public 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();

        // 判断是不是admin
        if (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)){
                // 自定义数据权限  :  根据用户角色查找部门id
                sql.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.coloradmin.cn/o/733977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五.LLC谐振变换器

LLC 谐振变换器启动过程分析 LLC 谐振变换器的组成结构中包含容性器件&#xff0c;为了尽可能减小输出电压纹波&#xff0c;钳位输出电压&#xff0c;此时希望输出滤波电容尽可能的大&#xff0c;因此也会在启动的时候&#xff0c;电容两端电压近似为 0&#xff0c;系统对电容…

Final2x-开源图片无损放大工具 提升分辨率到任意尺寸

一、Final2x是什么 Final2x是一款开源、跨平台的图片无损放大工具&#xff0c;内置多个模型&#xff0c;能够将图片提升分辨率到任意尺寸&#xff0c;增强图像的分辨率和质量&#xff0c;使图像更清晰、更详细。目前支持RealCUGAN、RealESRGAN、Waifu2x、SRMD等多种模型。支持…

不会写代码,咋做爬虫

随着时代的发展&#xff0c;大数据越来越重要&#xff0c;数据获取很关键 提到数据获取大家应该都会想到爬虫&#xff0c;但是我不会写代码怎么玩爬虫 今天给大家分享一个不会代码也可以进行爬虫的工具&#xff0c;实现无代码进行数据获取 强调 这里介绍的工具大家合理合法使用…

使用黑盒测试在 Go 中重写 Bash 脚本

目录 前言&#xff1a; 开始 准备工作 描述行为&#xff1a;Bats 简介 行为描述&#xff1a;陷阱 描述行为&#xff1a;设计测试 重写&#xff1a;让我们开始用go吧&#xff01; 重构和更新&#xff1a;实现胜利 结论 前言&#xff1a; 使用黑盒测试在Go中重写Bash脚本…

Linux bio数据结构

数据结构 /** main unit of I/O for the block layer and lower layers (ie drivers and* stacking drivers)*/ struct bio {struct bio *bi_next; /* request queue link */struct gendisk *bi_disk;unsigned int bi_opf; /* bottom bits req flags,* top bits REQ_OP. Us…

go入门demo

go快速学习&#xff1a; 官网学习方案&#xff08;选择自己喜欢的语言&#xff09;&#xff1a;A Tour of Go 视频:B站是个不错的选择 &#xff08;转go入门使用&#xff09;推荐视频&#xff1a;1-课程需知与课程提纲_哔哩哔哩_bilibili1-课程需知与课程提纲是8小时转职Gol…

把握住golang中的template,方能驾驭得了Hugo主题的template

笔者小站&#xff1a;秋码记录 不置可否&#xff0c;Hugo的template同样是使用golang的标准库html/template。为了能实现一个属于自己独特的Hugo theme&#xff0c;或是修改他人的主题&#xff0c;都得对其模板语法有所知晓&#xff0c;方能改的称心如意&#xff0c;亦或是制作…

HarmonyOS学习路之开发篇—数据管理(融合搜索)

融合搜索概述 HarmonyOS融合搜索为开发者提供搜索引擎级的全文搜索能力&#xff0c;可支持应用内搜索和系统全局搜索&#xff0c;为用户提供更加准确、高效的搜索体验。 基本概念 全文索引 记录字或词的位置和次数等属性&#xff0c;建立的倒排索引。 全文搜索 通过全文索引进…

GEE:哨兵数据时间序列计算物候时期EOS/SOS

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用哨兵数据时间序列计算植被物候时期EOS/SOS的代码。 文章目录 一、需要代码请私聊二、代码三、代码链接 一、需要代码请私聊 二、代码 //待更新 三、代码链接 //待更新 声明&#xff1a; 本人作为一名作者&#xff0c;非常重…

11 Java的三元运算符使用

三元运算符使用规则&#xff1a; 关系表达式 ? 表达式1 : 表达式2; 如果关系表达式成立&#xff0c;则结果是表达式1&#xff0c;如果不成立&#xff0c;则结果为表达式2。 package demo;public class Demo1 {public static void main(String[] args) {int a 20;int b 30;i…

基于simulink使用二维规范化互相关进行模式匹配和目标跟踪(附源码)

一、前言 此示例演示如何使用二维规范化互相关进行模式匹配和目标跟踪。双击“编辑参数”块以选择要检测的类似目标的数量。您还可以更改金字塔因子。通过增加它&#xff0c;您可以更快地将目标模板与每个视频帧匹配。更改金字塔因子可能需要更改阈值。 此外&#xff0c;还可…

从零实现深度学习框架——深入浅出PackedSequence

引言 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架&#xff0c;该框架类似PyTorch能实现自动求导。 &#x1f4a1;系列文章完整目录&#xff1a; &#x1f449;点此&#x1f448; 要深入理解…

使用RabbitMQ

使用RabbitMQ 1 Docker安装RabbitMQ 1.1 安装RabbitMQ # 下载含有管理页面的镜像 docker pull rabbitmq:3.8.8-management# 创建容器 # 5672&#xff1a;应用访问端口&#xff1b;15672&#xff1a;控制台Web端口号&#xff1b; docker run -itd \ --namemy-rabbitmq \ --re…

【Python】Python基础知识总结

&#x1f389;欢迎来到Python专栏~Python基础知识总结 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望…

5. 学成在线案例

1.典型的企业级网站 2.目的&#xff1a;整体感知企业级网站布局流程&#xff0c;复习以前的知识 5.1 准备素材和工具 1.学成在线PSD源文件 2.开发工具 PS(切图) / cutterman插件 vscode(代码) chrome(测试) 5.2 案例准备工作 采取结构与样式相分离思想&#xff1a; 1.创…

【备战秋招】每日一题:2022.11.3-华为机试-去除多余空格

为了更好的阅读体检&#xff0c;可以查看我的算法学习网 在线评测链接:P1058 题目描述 塔子哥最近接到导师的一个任务&#xff0c;需要他帮忙去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词…

豆瓣T250电影

爬取电影名字、年份、评分、评价人数 import requests import re import csv"""1、拿到页面源代码"""headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.…

IntelliJ IDEA安装Mybatis 插件Free Mybatis plugin

需求描述 在开发一些Mybatis的项目&#xff0c;经常需要写一个Mapper接口&#xff0c;在找代码过程&#xff0c;经常需要去找对应的xml文件&#xff0c;所以非常的不方便。自从有了免费的free-mybatis-plugin插件之后 &#xff0c;在可以实现在idea里一键跳转到对应的xml文件&…

CRC16_Verilog

CRC校验 CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是数据通信领域中最常用的一种查错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&#xff0c;…

Mac系统远程连接Windows11

一、远程桌面连接Windows11 1、下载并安装Microsoft Remote Desktop for mac。&#xff08;Microsoft Remote Desktop for mac简介&#xff0c;下载链接&#xff09; 2、Windows11开启远程桌面。 3、为当前Windows11账号设置密码。 二、ssh连接Windows11 1、下载并安装OpenSS…