数据权限-字段权限【实践篇-结合相关业务详细讲解如何实现】(基于若依框架)

理论看这个
https://blog.csdn.net/weixin_41842550/article/details/119890216

这里写目录标题

    • 按照部门结构和用户数据来实现数据权限
      • 一 需要的基础数据
        • 1 系统管理--部门管理--增加如下结构
        • 2 系统管理--角色管理--增加两个角色
        • 3 系统管理--用户管理--增加7个用户
      • 二 截图和代码实现如下
        • 1 建表
        • 2 系统的BaseEntity
        • 3 entity文件
        • 4 xml文件
        • 5 mapper文件
        • 6 service和impl文件
        • 7 controller文件
      • 三 验证数据权限
        • 1 部门基础数据如下
        • 2 ask表基础数据
        • 3 没加数据权限的数据
        • 4 张三的数据
        • 5 部门A经理的数据
        • 6 部门A-员工1的数据
    • 扩展-字段权限思路
        • 1 字段信息表
        • 2 和角色挂钩
        • 3 动态拼接


按照部门结构和用户数据来实现数据权限

普通员工只能看自己的请假数据,领导可以看自己及自己所在部门所有员工的请假数据

这里以请假为例,其实只要是符合部门数据权限的任何业务数据均可以按照这个案例来实现

本篇采用电脑本地数据库mysql、本地启动java、本地启动vue。使用token来区别是否达到了数据权限,通过postman来调用接口测试

项目的端口上下文我都修改了
在这里插入图片描述

一 需要的基础数据

1 系统管理–部门管理–增加如下结构

在这里插入图片描述

这里去数据库sys_dept表看一下dept_id,一会儿我们造假数据的时候用
ancestors是祖先dept_id多个逗号分开,有了这个字段就不用递归找了,效率提升了非常多
在这里插入图片描述

2 系统管理–角色管理–增加两个角色

4:本部门及以下数据权限;5:仅本人数据权限;【这两个均为系统保留的数据权限】
在这里插入图片描述

在这里插入图片描述
数据权限使用data_scope字段
data_scope字段不支持页面修改,需要自己手动改数据库
role key是菜单按钮权限,不建议和数据权限混着用。这里随便写

在这里插入图片描述

3 系统管理–用户管理–增加7个用户

张三–研发部门-总监:可以看到部门及以下的所有人的数据
部门A经理:可以看到部门A及以下的所有人的数据,看不到总监-张三的数据(部门选部门A;角色选本部门及以下数据权限)
部门A员工1:部门选部门A;角色仅本人数据权限
部门A员工2:部门选部门A;角色仅本人数据权限
部门B经理:可以看到部门B及以下的所有人的数据,看不到总监-张三的数据(部门选部门B;角色选本部门及以下数据权限)
部门B员工1:部门选部门B;角色仅本人数据权限
部门B员工2:部门选部门B;角色仅本人数据权限

在这里插入图片描述

新增的时候选好对应的部门角色
新增这里密码设置的简单些,一会需要登录拿token来验证,截图是修改
在这里插入图片描述

二 截图和代码实现如下

我这里方便演示就放到了SysConfigController及一系列service、mapper文件里面了

1 建表

在这里插入图片描述

CREATE TABLE `ask` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL COMMENT '请假标题',
  `dept_id` int(11) DEFAULT NULL COMMENT '部门id',
  `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

其他业务同理,只要加上dept_id和user_id就可以实现本人数据权限和部门数据权限

2 系统的BaseEntity

在这里插入图片描述

3 entity文件

这里需要继承BaseEntity,数据权限的sql片段就在BaseEntity里面的params属性中
在这里插入图片描述

package com.ruoyi.system.domain;

import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;

@Data
public class AskEntity extends BaseEntity {
    private Long id;
    private String title;
    private Long deptId;
    private Long userId;
}
4 xml文件
    <select id="selectAskList" parameterType="com.ruoyi.system.domain.AskEntity" resultType="com.ruoyi.system.domain.AskEntity">
        select * from ask where 1=1 ${params.dataScope}
    </select>

在这里插入图片描述

5 mapper文件

在这里插入图片描述

需要引入的包路径

import com.ruoyi.system.domain.AskEntity;
	List<AskEntity> selectAskList(AskEntity askEntity);
6 service和impl文件

在这里插入图片描述

在这里插入图片描述

	List<AskEntity> selectAskList(AskEntity askEntity);
    @Override
    public List<AskEntity> selectAskList(AskEntity askEntity) {
        return configMapper.selectAskList(askEntity);
    }
7 controller文件

在这里插入图片描述

    @GetMapping("/selectAskList")
    public TableDataInfo list(AskEntity askEntity)
    {
        startPage();
        List<AskEntity> list = configService.selectAskList(askEntity);
        return getDataTable(list);
    }

三 验证数据权限

增加对应的数据,这里dept_id和user_id我就直接写死在数据库了,理论上来说是需要在新增某些业务数据的时候把dept_id设置进去

import com.ruoyi.common.utils.SecurityUtils;

代码获取deptId,前提是用户列表已经配置好部门了
Long deptId = SecurityUtils.getLoginUser().getDeptId();
Long userId = SecurityUtils.getLoginUser().getUserId();

1 部门基础数据如下

dept_id dept_name
103 研发部门
110 部门A
111 部门B

2 ask表基础数据
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (1, '研发部门-总监-张三请假', 103, 3);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (2, '部门A-经理请假', 110, 4);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (3, '部门B-经理请假', 111, 8);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (4, '部门A-员工1请假', 110, 5);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (5, '部门A-员工2请假', 110, 6);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (6, '部门B-员工1请假', 111, 10);
INSERT INTO `ruoyi`.`ask` (`id`, `title`, `dept_id`, `user_id`) VALUES (7, '部门B-员工2请假', 111, 9);

在这里插入图片描述

3 没加数据权限的数据

谁便找个接口,请求头里面的Authorization就是token
在这里插入图片描述

postman调佣接口,上面的token复制过来
没加数据权限有7条数据
在这里插入图片描述

4 张三的数据

这里稍微改一下之前的代码,xml里面的表增加了别名ask

    <select id="selectAskList" parameterType="com.ruoyi.system.domain.AskEntity"
            resultType="com.ruoyi.system.domain.AskEntity">
        select * from ask as ask
        where 1=1
            ${params.dataScope}
    </select>

ServiceImpl累里面增加了数据权限的注解

@DataScope(deptAlias = "ask", userAlias = "ask")

在这里插入图片描述

使用张三的token查询数据

在这里插入图片描述
打印的sql如下

SELECT
	* 
FROM
	ask AS ask 
WHERE
	1 = 1 
	AND (
		
	ask.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = 103 OR find_in_set( 103, ancestors ) )
		
	) 

在这里插入图片描述

主要是查了部门表
dept_id = 103【dept_id103代表研发部门的id,也就是自己的数据】
find_in_set( 103, ancestors )【祖先dept_id有103研发部门的,也就是103部门下面的所有子级的部门】这里的祖先id设计的非常巧妙,真的不用递归就能实现一棵树的向下查询

5 部门A经理的数据

同理如上

在这里插入图片描述
sql如下,其实就是dept_id 不一样了

SELECT
	* 
FROM
	ask AS ask 
WHERE
	1 = 1 
	AND (
	ask.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = 110 OR find_in_set( 110, ancestors ) )
	) 

在这里插入图片描述

6 部门A-员工1的数据

同理如上

在这里插入图片描述

select * from ask as ask where 1=1 AND (ask.user_id = 5 )

这个sql就比较简单了,就查了一个user_id 为自己的

部门B-员工2 的数据也是同理,换一下user_id就行
在这里插入图片描述

扩展-字段权限思路

基于数据权限的基础,实现字段权限就非常简单了

比如经理可以查看10个字段,普通员工查看5个字段

1 字段信息表

首先得有一个字段信息表,用来维护需要做字段权限的表的字段信息

CREATE TABLE `sys_field` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `table_name` varchar(255) DEFAULT NULL COMMENT '表名字英文',
  `table_remark` varchar(255) DEFAULT NULL COMMENT '表备注中文',
  `field_list` varchar(2000) DEFAULT NULL COMMENT '字段信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

在这里插入图片描述
field_list里面最好放一个数组,里面有多个对象,每个对象都是一个字段信息。这个信息可以做一个页面来增删改查,也可以有开发人员自己维护

[{"field":"title","remark":"请假标题"},{"field":"center","remark":"请假内容"},{"field":"f3","remark":"字段3"},{"field":"f4","remark":"字段4"}]

在这里插入图片描述

2 和角色挂钩

角色表新增一个字段field_str用来存放需要查询的字段,最好是一个角色一组字段字符串信息

新增角色的时候可以增加一个选取字段的多选框或者多选的下拉框,具体的值就是刚才的field_list里面的多个对象的field字段的值。选好后最终存储到角色表的field_str多个逗号分开

在这里插入图片描述

3 动态拼接

还是利用AOP来实现动态组装字段,存放到map里面去
通过注解来决定那些查询需要动态字段
mapper.xml文件里面再拿出来就可以了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

35岁危机来临前,程序员如何未雨绸缪?

程序员逼近35岁”高龄“&#xff0c;救命。。。 &#xff08;目瞪口呆)什么&#xff1f; 程序员而立之年&#xff0c;为未来担忧&#xff1f;&#xff08;双手抱头不敢置信&#xff09; 不可能&#xff01;他们明明那么努力、那么辛苦了&#xff01;&#xff01;&#xff01;&a…

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解&#xff0c;不知道其是什么意思&#xff1f;使用SQL审计的目的是什么&#xff1f;使用SQL审计的好处有哪些&#xff1f;这里我们大家就来一起聊聊&#xff0c;仅供参考哈&#xff01; SQL审计是什么意思&#xff1f; 【回答】&…

【原理篇】三、SpringBoot自动配置原理

文章目录 0、背景demo1、自动配置思路2、META-INF/spring.factories3、Redis自动配置4、自定义一个自动配置5、排除SpringBoot内置自动配置类的加载6、补充点&#xff1a;ApplicationContextAware接口 0、背景demo 用一个循序渐进的示例来体验属性配置&#xff0c;方便后面理解…

Oracle 安装及 Spring 使用 Oracle

参考内容&#xff1a; docker安装oracle数据库史上最全步骤&#xff08;带图文&#xff09; Mac下oracle数据库客户端 Docker安装Oracle docker能安装oracle吗 Batch script for add a auto-increased primary key for exist table with records Docker 安装 Oracle11g 注意&a…

用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组

目录 一、冒泡排序 1.冒泡排序介绍 2.排序的思路 3.完整代码 二、折半查找 1.折半查找介绍 2.查找的思路 3.完整代码 三、逆序数组 1.逆序思路 2..完整代码 一、冒泡排序 冒泡排序是众多排序的一种&#xff0c;无论在C语言或者Java中都很常见&#xff0c;后续在数据…

浅谈智能变电站自动化系统的应用与产品选型

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;现如今&#xff0c;智能变电站发展已经成为了电力系统发展过程中的内容&#xff0c;如何提高智能变电站的运行效率也成为电力系统发展的一个重要目标&#xff0c;为了能够更好地促进电力系统安全稳定运行&#xff0c;…

轻量封装WebGPU渲染系统示例<22>- 渲染到纹理(RTT)(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/RTTTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class RTTTest {private mRscene new RendererScene()…

使用 Threejs 从基础开始构建 3D 地球

需求 threejs学习-3D 地球 实现&#xff1a; 1、使用粒子效果模拟宇宙星空 2、贴图、模型等资源的加载 3、加载资源的监听 4、效果合成器 EffectComposer 的初级使用 5、在地球上设置坐标以及坐标涟漪动画 6、标点间建立飞线 7、简单动画建议先浏览一遍git地址上代码&#xff…

SpringMVC简介

SpringMVC简介 一、MVC是什么二、什么是SpringMVC&#xff1f;1.特点 三、简单实现 一、MVC是什么 MVC是模型视图控制器的简称&#xff0c;是指一种架构思想。 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据。 JavaBean分为…

A Survey on Neural Network Interpretability

A Survey on Neural Network Interpretability----《神经网络可解释性调查》 摘要 随着深度神经网络的巨大成功&#xff0c;人们也越来越担心它们的黑盒性质。可解释性问题影响了人们对深度学习系统的信任。它还与许多伦理问题有关&#xff0c;例如算法歧视。此外&#xff0c;…

基于Python的书籍数据采集与可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 基于Python的书籍数据采集与可视化分析系统旨在挖掘和分析海量图书数据背后的规律和趋势&#xff0c;为读者、出版商和数据分析师提供更深入的洞察和辅助决策。本系统依托于某瓣庞大的图书…

JS逆向爬虫---请求参数加密②【某麦数据analysis参数加密】

主页链接: https://www.qimai.cn/rank analysis逆向 完整参数生成代码如下&#xff1a; const {JSDOM} require(jsdom) const dom new JSDOM(<!DOCTYPE html><p>hello</p>) window dom.windowfunction customDecrypt(n, t) {t t || generateKey(); //…

20 VPN详解

1、连接数据中心 1.第一种方式是走公网&#xff0c;但是公网太不安全 2.第二种方式是专线&#xff0c;但是比较贵 3.VPN连接2、vpn的概念 全名Virtual Private Network&#xff0c;虚拟专用网&#xff0c;就是利用开放的公众网络&#xff0c;建立专用数据传输通道&#xff0c…

洛谷P5731 【深基5.习6】蛇形方阵java版题解

import java.util.Arrays; import java.util.Scanner;// 给出一个不大于9的正整数n&#xff0c;输出nn的蛇形方阵。 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[][] a new int[n][n];int total…

《016.SpringBoot+vue校园社团管理系统》【有文档】

《016.SpringBootvue校园社团管理系统》【有文档】 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMyBatisPlus; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a…

HCIP---VLAN

文章目录 目录 目录 文章目录 前言 一.VLAN概述 作用&#xff1a; 二.VLAN基础认识 VLAN ID: VLAN端口类别 总结 前言 VLAN技术是现代企业网络和数据中心网络的核心技术之一。本文将重点针对VLAN技术进行详解。 一.VLAN概述 VLAN&#xff08;Virtual Local Area Network…

自动化实战 - 测试个人博客系统

前言 本篇使用Selenium3Junit5对个人博客进行自动化测试&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言一.web自动化测试用例二.测试准备1.注册界面自动化测试测试过程中遇到的Bug: 2.登录界面自动…

Java基础——数组(一维数组与二维数组)

文章目录 一维数组声明初始化与赋值内存图解 二维数组声明初始化与赋值内存图解 数组练习杨辉三角冒泡排序线性查找二分法数组反转 数组是多个相同类型的数据按一定顺序排列的集合。 说明&#xff1a; 数组是引用数据类型&#xff0c;数组的元素是同一类型的任何数据类型&…

【C#学习笔记】事件

前言 在之前我学习委托的时候&#xff0c;写到了 学习了委托&#xff0c;事件其实也就学习了&#xff0c;事件和委托基本上一模一样&#xff1a; 然而在实际工作中通过对事件的深入学习后发现&#xff0c;实际上事件的使用比委托要严格一些&#xff0c;本节将详细讲解事件的使…

介绍两个好用又好玩的大模型工具

先让数字人跟大家打个招呼吧。 我的AI数字人会手语了 发现没&#xff0c;我的数字人本周又学了一个新技能&#xff1a;手语。 这些数字人都是通过AI生成的。 但数字人不是今天的主题&#xff0c;今天要跟大家聊聊大模型。 自从大模型出现后&#xff0c;很多人&#xff08;包…