首页 > 其他分享 >mybatisplus3.5.3版本,数据权限如何使用

mybatisplus3.5.3版本,数据权限如何使用

时间:2023-10-15 18:14:05浏览次数:43  
标签:mybatisplus3.5 jsqlparser 版本 org import net 权限 com sf

1、添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.liubaihui</groupId>
    <artifactId>datapress-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>datapress-test</name>
    <description>datapress-test</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>3.0.2</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.0.2</version>
            </plugin>
        </plugins>
    </build>

</project>

2、添加拦截器

package com.liubaihui.datapresstest.configure;

import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.*;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.select.SetOperationList;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.SQLException;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@Component
public class MyDataPermissionInterceptor extends DataPermissionInterceptor {
    @Autowired
    private MyDataPermissionHandler myDataPermissionHandler=new MyDataPermissionHandler();


    @Override
    public Expression buildTableExpression(Table table, Expression where, String whereSegment) {
        return myDataPermissionHandler.getSqlSegment(table, where, whereSegment);
    }
}

3、添加处理器

package com.liubaihui.datapresstest.configure;

import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
import com.baomidou.mybatisplus.generator.jdbc.DatabaseMetaDataWrapper;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.HexValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 参考:https://baijiahao.baidu.com/s?id=1773281250190331633&wfr=spider&for=pc
 * @author: liubh
 * @since: 2023/10/15
 */
@Component
public class MyDataPermissionHandler implements MultiDataPermissionHandler {


    @Override
    public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {
        if (where == null) {
            where = new HexValue(" 1 = 1 ");
        }


        //获取mapper名称
        String className = mappedStatementId.substring(0, mappedStatementId.lastIndexOf("."));
        //获取方法名
        String methodName = mappedStatementId.substring(mappedStatementId.lastIndexOf(".") + 1);
//     String fromItem = table.getName();
//        // 有别名用别名,无别名用表名,防止字段冲突报错
//        Alias fromItemAlias = fromItem.getAlias();
//        String mainTableName = fromItemAlias == null ? fromItem.getName() : fromItemAlias.getName();
        //获取当前mapper 的方法
        Method[] methods = new Method[0];
        try {
            methods = Class.forName(className).getMethods();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        //遍历判断mapper 的所以方法,判断方法上是否有 UserDataPermission
        for (Method m : methods) {
            if (Objects.equals(m.getName(), methodName)) {
                EqualsTo usesEqualsTo = new EqualsTo();

                usesEqualsTo.setLeftExpression( new Column(table.getName() + ".company_id"));
                usesEqualsTo.setRightExpression(new StringValue("1"));
                return new AndExpression(where, usesEqualsTo);

            }

        }
        //说明无权查看,
        where = new HexValue(" 1 = 2 ");
        return where;
    }
}

4、设置拦截器

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加数据权限插件
        MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
        // 添加自定义的数据权限处理器
        dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
        interceptor.addInnerInterceptor(dataPermissionInterceptor);
        return interceptor;
    }

 参考:实现过滤多个字段值 https://baijiahao.baidu.com/s?id=1773281250190331633&wfr=spider&for=pc

标签:mybatisplus3.5,jsqlparser,版本,org,import,net,权限,com,sf
From: https://www.cnblogs.com/liubaihui/p/17765898.html

相关文章

  • Linux系统第四章文件权限读书笔记
    基本权限UGO:     1.UGO权限的含义:UGO是Linux文件权限管理中的基本概念,表示用户(User)、组(Group)、其他人(Others)。这三个范围定义了文件或目录的访问权限,控制着谁可以执行何种操作。User(用户):这是文件或目录的所有者。用户权限是最重要的,因为他们拥有最高级别的控制权......
  • 记Halo1.5版本迁移Halo2.10.0版本
    原文地址:记Halo1.5版本迁移Halo2.10.0版本-Stars-One的杂货小窝上一篇Window10安装linux子系统及子系统安装1Panel面板-Stars-One的杂货小窝将对应的环境都准备好了,这下我们可以通过1Panel进行halo的2.10版本安装,来测试新版本升级是否有什么问题本篇文章实际是在本地L......
  • nifi下载Win版本安装成功运行
    一、Apachenifi相关网址https://nifi.apache.org/ 官网https://nifi.apache.org/docs.html 文档https://nifi.apache.org/download.html 下载页##二、Apachenifi本地安装进入https://nifi.apache.org/download.html解压到本地bin目录下有启动和......
  • rbac权限
    1.1认证认证基本介绍kubernetes主要通过APIserver对外提供服务,那么就需要对访问apiserver的用户做认证,如果任何人都能访问apiserver,那么就可以随意在k8s集群部署资源,这是非常危险的,也容易被黑客攻击渗透,所以需要我们对访问k8s系统的apiserver的用户进行认证,确保是合法的符合要......
  • 【Linux 基础】gcc、g++多版本间的切换
    在make时可能出现版本过高的问题,因此需要进行版本切换。gcc多版本间的切换(g++配置方法一样,gcc换为g++即可)系统:ubuntu18方法:根据需要同步设置gcc与g++间的版本号1.gcc安装(多版本) sudoapt-getupdate sudoapt-getinstallgcc##安装最新版本,此处为7 sudoapt-getinstall......
  • 如何在 XAMPP 中使用 不同的 PHP 版本?
    你有没有碰到这种情况,你工作的项目需要的是PHP8,而你自己的项目需要的是PHP7,而你又特别钟爱于XAMPP,奈何它却不能自由切换PHP版本,下面就讲下本人在用的方法将PHP7更新到PHP8,可以通过单个XAMPP在Windows系统下安装设置多个版本的PHP。1、下载PHP8压缩包打开 XAMPP 官网,下载你所需......
  • 设置不同区域编辑权限
    问题:为不同区域设置不同权限解决:审阅》允许编辑区域》新建》设置区域与密码》重复新建多个区域》保护工作表......
  • Mac上使用jenv管理多个java版本
    Mac上可以使用Homebrew安装jenvbrewinstalljenv配置jenv的环境变量,向~/.profile(bash用户)或者~/.zshrc(zsh用户)文件中添加如下代码exportPATH="$HOME/.jenv/bin:$PATH"eval"$(jenvinit-)"使用如下命令添加java_home的路径到jenvjenvadd/Library/Java/JavaVirtual......
  • Linux怎么修改权限
    rwx:r代表可读,w代表可写,x代表该文件是一个可执行文件,如果rwx任意位置变为-则代表不可读或不可写或不可执行文件。示例:给aaa.txt文件权限改为可执行文件权限,aaa.txt文件的权限时-rw----第一位:-就代表是文件,d代表是文件夹第一段(3位):代表拥有者的权限第二段(3位):代表拥有者所在的组,组员的......
  • Firefox 118 版本发布,带来了原生的翻译功能
    导读近期,Mozilla积极努力改进Firefox,以使其在各方面都更强大,例如针对谷歌的Web服务提供更强大的 支持,以及之前发布的 Firefox117版本。现在,Firefox的新版本118来到了我们面前,它终于带来了注重隐私保护的原生翻译功能,无需寻找临时解决方案。让我们一起深入了解......