• 若依项目里面的数据权限注解@DataScope 注解的实现原理 与 使用逻辑


    1 背景

    @DataScope 注解处理的内容叫做数据权限,就是说你这个用户登录后能够访问哪些数据。传统的做法就是根据当前认证用户的 id 或者角色或者权限等信息去查询,但是这种做法比较麻烦比较费事,每次查询都要写大量 SQL,而这些 SQL 中又有大量雷同的地方,所以我们希望能够将之进行统一处理,进而就引出了 @DataScope 注解。

    2 大体逻辑

    若依框架里面

    数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)

    在这里插入图片描述

    要实现通过一个注解,注解里面的不同的值就可以实现查询不同的数据,主要的功能就是动态的拼接sql,因为我们要查询数据的时候,主要是xml里面写sql语句,但是现在要求根据不同的角色动态的查询出不同的数据,所以我们需要在代码里面自己拼接一个sql语句,将这个sql语句传到xml里面,就可以实现动态的查询了,但是这个sql语句,在代码里面咋弄出来。

    这个时候就使用注解了,这个注解的作用就是生成动态的sql语句,将这个sql语句存放到实体类里面,因为我们在mapper层的接口方法的参数是实体类,在xml里面接收这个接口的参数,在xml里面获取参数里面的东西,所以我们需要将生成的动态的sql语句放到实体类里面。

    怎么放?

    3 涉及到的文件

    如果要实现这个功能,我们需要看哪些文件?

    1 自定义注解

    在这里插入图片描述
    2 aop功能扩展

    在这里插入图片描述

    3 在你需要的实现数据权限的接口的service层加上这个注解

    在这里插入图片描述

    4 xml里面获取

    在这里插入图片描述
    ${params.dataScope}
    通过这个就是获取到一个动态的sql语句

    以上就是这个功能实现的大体流程,具体的逻辑就在上面的文件里面的具体代码了

    4 代码

    每一个涉及到的文件里面代码什么意思,已经写好注释了

    1 注解

    
    /**
     * 数据权限过滤注解
     * 
     * @author jing
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataScope
    {
       
        /**
         * 部门表的别名
         */
        public String deptAlias() default "";
    
        /**
         * 用户表的别名
         */
        public String userAlias() default "";
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述
    2 aop代码

    package com.ruoyi.framework.aspectj;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    import com.ruoyi.common.annotation.DataScope;
    import com.ruoyi.common.core.domain.BaseEntity;
    import com.ruoyi.common.core.domain.entity.SysRole;
    import
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    YOLOv5 PyQt5 | PyQt5快速入门 | 2/3
    现代_复习_第2章:矩阵
    【kafka】三、kafka命令行操作
    第2关:创建表
    Rust编程-泛型、Trait和生命周期
    scau CSAPP datalab1
    指针进阶(2)
    淘宝镜像的https证书过期
    Java学习——正则表达式
    docker项目部署
  • 原文地址:https://blog.csdn.net/python113/article/details/127347430