当前位置: 首页 > article >正文

spring boot 登入权限RBAC模式

首先准备好5张表

user_info表,用户的信息表

role表,角色表(比如超级管理员、管理员、审核员、采购......)

创建user_role表,user_info表,role表的中间表

注意了,role_id和user_id是        user_info表和role表的关联id 

auth_info表 菜单权限

创建roler_ayth表 ,auth表和role表的中间表

注意了,role_id和auth_id是        role_id表和auth_info表的关联id 

也就是用户和角色有和中间表,角色和菜单表有个中间表 


有表了我们开始做菜单树

1、创建实体类,mapper,service实现接口,impl实现类,映射文件mapper

博主用的是MyBatisCodeHelperPro插件,用逆向工程也就是从菜单树开始查询(MybatisX、Mybatis puls、Mybatis..插件必须卸载会冲突的,新手可以试用7天,价格在59人民币一年这样)

首先链接数据源

 

 找到菜单权限auth_info表  右键

最后确定


 这就是我们说的实体类,mapper,service实现接口,impl实现类,映射文件mapper


2、AuthInfoMapper类

package com.pn.service;import com.pn.entity.AuthInfo;
import java.util.List;public interface AuthInfoService{public List<AuthInfo> queryAuthInfoByUid(Integer userId);
}

3、AuthInfoMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pn.mapper.AuthInfoMapper"><!--  根据用户ID查用户权限菜单--><!-- 得出合法行这个是固定的: select t3.* from user_role t1, role_auth t2, auth_info t3where t1.role_id = t2.role_id and t2.auth_id = t3.auth_id and t1.user_id = #{userId} -->
<!--  其他条件根据自己的表来,比如博主这个t3.auth_state=1是说明开启的 --><select id="getAuthInfoByUid" resultType="AuthInfo">select t3.* from user_role t1, role_auth t2, auth_info t3where t1.role_id = t2.role_id and t2.auth_id = t3.auth_idand t3.auth_state = 1and t3.auth_type != 3and t1.user_id = #{userId}</select>
</mapper>

4、AuthInfoService 实现类接口

package com.pn.service;import com.pn.entity.AuthInfo;
import java.util.List;public interface AuthInfoService{public List<AuthInfo> queryAuthInfoByUid(Integer userId);
}

5、AuthInfoServiceImpl 实现类

package com.pn.service.impl;import com.alibaba.fastjson.JSON;
import com.pn.entity.AuthInfo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import com.pn.mapper.AuthInfoMapper;
import com.pn.service.AuthInfoService;
import org.springframework.util.StringUtils;import java.time.Duration;
import java.util.ArrayList;
import java.util.List;@Service
public class AuthInfoServiceImpl implements AuthInfoService{@Autowiredprivate AuthInfoMapper authInfoMapper;// 0库 博主用的是自己封装好的redis分库的,可以自己用自己的,也可以不用//@Autowired//@Qualifier("reactiveRedisTemplateDb0")//private ReactiveRedisTemplate<String, Object> redis;/***  查询用户菜单数的业务方法* @param userId* @return*/@Overridepublic List<AuthInfo> queryAuthInfoByUid(Integer userId) {//先从redis查缓存,因为权限很少改动,所有放缓存,//String authTerrJson = (String) redis.opsForValue().get("authTree:"+userId).block();//有的话string转json给前端//if (StringUtils.hasText(authTerrJson)) {//    return JSON.parseArray(authTerrJson, AuthInfo.class);//}//查redis无缓存,查数据库List<AuthInfo> allauthInfo = authInfoMapper.getAuthInfoByUid(userId);// 将查出的菜单List<AuthInfo>转成菜单树,需要递归算法List<AuthInfo> authInfoList = allAuthToAuthTree(allauthInfo,0);// 查出的菜单树存redis,并设置有效期//redis.opsForValue().set("authTree:"+userId, JSON.toJSONString(authInfoList), Duration.ofSeconds(3600*24)).subscribe();return authInfoList;}// 递归算法,必须是私有的private List<AuthInfo> allAuthToAuthTree(List<AuthInfo> allauthInfo, Integer pid) {//查出一级菜单List<AuthInfo> allauthInfoList = new ArrayList<>();for (AuthInfo authInfo : allauthInfo) {if (authInfo.getParentId().equals(pid)) {allauthInfoList.add(authInfo);}}// 从一级菜单拿二级菜单for (AuthInfo firstauthInfo : allauthInfoList) {List<AuthInfo> firstauthInfoList = allAuthToAuthTree(allauthInfo,firstauthInfo.getAuthId());firstauthInfo.setChildAuth(firstauthInfoList);}//返回菜单树return allauthInfoList;}
}

6、AuthInfo实体类

package com.pn.entity;import java.io.Serializable;
import java.util.Date;
import java.util.List;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 权限表*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AuthInfo implements Serializable {private Integer authId;/*** 父id为空或为0,表示一级权限*/private Integer parentId;private String authName;private String authDesc;private Integer authGrade;/*** 1 模块 、2  列表、 3  按钮*/private String authType;private String authUrl;private String authCode;private Integer authOrder;/*** 1 启用 、0 禁用*/private String authState;private Integer createBy;private Date createTime;private Integer updateBy;private Date updateTime;/***  存放当前菜单下的所有子菜单*/private List<AuthInfo> childAuth;
}

7、最后控制器,更具自己的前端给到的数据写

   /*** 用户权限*/// 注入UserService接口@Autowiredprivate AuthInfoService authInfoService;
@RequestMapping("user/auth-list")public Result userAuthTree(@RequestHeader(WarehouseConstants.HEADER_TOKEN_NAME) String token) {//获取到token,并解析CurrentUser currentUser = tokenUtil.getCurrentUser(token);// 主要是这个  接口传递用户idList<AuthInfo> authInfos = authInfoService.queryAuthInfoByUid(currentUser.getUserId());return Result.ok("获取成功",authInfos);}

相关文章:

spring boot 登入权限RBAC模式

首先准备好5张表 user_info表&#xff0c;用户的信息表 role表&#xff0c;角色表&#xff08;比如超级管理员、管理员、审核员、采购......&#xff09; 创建user_role表&#xff0c;user_info表&#xff0c;role表的中间表 注意了&#xff0c;role_id和user_id是 u…...

调用API拿到的值——存储方式

1.响应结果示例&#xff1a; "purposeTagList":["稳中向好及进中提质"] 2.数据库中定义的 3.值的获取&#xff1a; F1 JsonNode purposeTagListNode dataNode.path("purposeTagList");if (purposeTagListNode.isArray()) {StringBuilder purp…...

【用 Trace读源码】PlanAgent 执行流程

前提条件 在 Trae 中打开 OpenManus 工程&#xff0c;使用 build 模式&#xff0c;模型选择 claude-sonnet-3.7 提示词 分析 agent/planning.py 中 main 方法及相关类的执行流程&#xff0c;以流程图的方式展示PlanningAgent 执行流程图 以下流程图展示了 PlanningAgent 类…...

第一讲 | 解锁C++编程能力:基础语法解析

C入门基础 一、C的第一个程序二、命名空间三、C输入&输出四、缺省参数/默认参数五、函数重载六、引用1.引用的特性2.引用的使用引用做返回值场景 3.const引用只有指针和引用涉及权限放大、缩小的问题&#xff0c;普通变量没有 4.指针和引用的关系 七、inline八、nullptr 一…...

LeetCode 热题 100_划分字母区间(80_763_中等_C++)(贪心算法(求并集))

LeetCode 热题 100_划分字母区间&#xff08;80_763&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法(求交集)&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法(求…...

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…...

HAL库中使用空闲中断+DMA接收数据,接收失败的问题

问题&#xff1a; 串口屏与单片机通过串口&#xff08;USART1&#xff09;进行通信&#xff0c;调试时发现问题&#xff0c;现象如下&#xff1a; 手动页面的几个文本&#xff0c;输入的数字不会显示出来&#xff0c;比如初始值为0&#xff0c;输入200&#xff0c;200会一闪而…...

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…...

【Scrapy】Scrapy教程8——处理子链接

通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…...

使用pycel将Excel移植到Python

1.适用需求 有些工作可能长期适用excel来进行公式计算&#xff0c;当需要把工作流程转换为可视化界面时&#xff0c;开发人员不懂专业逻辑&#xff0c;手动摸索公式很大可能出错&#xff0c;而且费时费力 2.可用工具及缺点 pandas 方便进行数据处理&#xff0c;支持各种格…...

学习应用层

应用层概述 客户/服务器方式&#xff08;C/S&#xff09;和对等方式&#xff08;P2P&#xff09; 动态主机配置协议DHCP 客户/服务器方式 DHCP报文会被封装成为UDP用户数据报&#xff0c;DHCP服务器端口号是UDP67&#xff0c;用户是UDP68。 广播发送&#xff0c;是因为并不知道…...

Doris官网上没有的一些Fe参数了,都在源码中

一、FE配置源码 apache-doris-src\fe\fe-common\src\main\java\org\apache\doris\common\Config.java 二、BE配置源码 apache-doris-src\be\src\common\config.cpp 三、FE源码 package org.apache.doris.common;public class Config extends ConfigBase {ConfField(descri…...

蓝桥杯算法精讲:二分查找实战与变种解析

适合人群&#xff1a;蓝桥杯备考生 | 算法竞赛入门者 | 二分查找进阶学习者 目录 一、二分查找核心要点 1. 算法思想 2. 适用条件 3. 算法模板 二、蓝桥杯真题实战 例题1&#xff1a;分巧克力&#xff08;蓝桥杯2017省赛&#xff09; 例题2&#xff1a;砍竹子&#xff0…...

C++脚本化方案调研

1 什么是脚本化 脚本化&#xff08;Scripting&#xff09;是指将脚本语言嵌入到主程序&#xff08;C等编译型语言&#xff09;中&#xff0c;通过以下方式扩展程序能力&#xff1a; 动态逻辑控制&#xff1a;通过脚本实现运行时逻辑调整&#xff0c;无需重新编译主程序&#x…...

蓝桥杯(N皇后问题)------回溯法

题目描述 在 NN 的方格棋盘放置了 N 个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意 2 个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成 45 角的斜线上。你的任务是&#xff0c;对于给定的 N&#xff0c;求出有多少种合法的放置方法…...

再探C语言(1)

温馨提示&#xff1a; 学C语言就像玩《掘地求升》——你以为懂了语法就能通关&#xff1f; 不&#xff01;编译器会用铁锤教你做人&#xff01;(╯‵□′)╯︵┻━┻ &#x1f431;Part 1&#xff1a;sizeofの跨平台迷惑行为 Q1. 不同环境下sizeof(int)的结果 运行环境结果&a…...

高项第十三章——项目资源管理

什么是资源管理&#xff1f;项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程。 本过程关注两类资源&#xff1a;实物资源包括设备、材料、设施和基础设施 团队资源或人员指的是团队的人力资源 13_1 项目资源管理基础 项目团队是执行项目工作&#xff0c…...

C/C++转换为字符串宏和字符串拼接宏的综合使用

本文内容参考: C/C++ 宏拼接和宏展开为字符串 - DoubleLi - 博客园 特此致谢! 1. 转换为字符串宏与字符串拼接宏 (1)转换为字符串宏 转换为字符串的宏为: #define STR(x) #x //转字符串 (2)字符串拼接宏 字符串拼接的宏为: #define CONCAT(x,y) x##y //拼接 2…...

Linux:xxx is not in the sudoers file. This incident will be reported.

报错 xxx is not in the sudoers file. This incident will be reported.解决方式 切换到root用户下操作 # 1、修改/etc/sudoers文件为可修改&#xff0c;默认是只读的 ls -lh /etc/sudoers -r--r----- 1 root root 4.3K Dec 1 01:45 /etc/sudoerschmod uw /etc/sudoersls…...

掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

个人常用的chrome好用插件

chrome可以说是兼容性和实用性较高的浏览器 没有复杂的ui 沉重的广告 加上各种各样的浏览器插件 现在罗列一下个人常用的几款好用的插件 1. Adblock Plus 一款免费的广告拦截器&#xff0c;可以拦截大部分网站上的广告推荐&#xff0c;还你一个干净舒服的页面 以下为b站演示…...

Redis 内存优化

Redis 内存优化 Redis性能优化可以从多个方面进行&#xff0c;主要包括以下几个方面&#xff1a; 1. 内存优化 Redis 是基于内存的数据库&#xff0c;优化内存使用可以提高性能并降低成本。 (1) 使用合适的数据结构 不同的数据结构占用的内存不同&#xff0c;选择合适的数据…...

数据库设计-笔记2

1.介绍一下MySQL 历史与发展 MySQL 最初由瑞典的 MySQL AB 公司开发&#xff0c;于 1995 年正式发布。2008 年&#xff0c;MySQL AB 公司被 Sun Microsystems 收购&#xff0c;之后 Sun 又被甲骨文&#xff08;Oracle&#xff09;公司收购&#xff0c;MySQL 成为 Oracle 旗下…...

【大模型】什么是循环神经网络(RNNs)

在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;**循环神经网络&#xff08;Recurrent Neural Networks, RNNs&#xff09;**是一种非常强大的工具&#xff0c;特别适合处理序列数据。无论是语言、时间序列还是音乐&#xff0c;RNNs都能帮助我们理解和预测这些数据的…...

hexo+butterfly搭建博客网站总结篇

hexobutterfly搭建博客网站总结篇 文章目录 hexobutterfly搭建博客网站总结篇0.往期栏目1.发现的不错的butterfly博主2.待实现的功能 && 结语笔者待实现的功能结语 0.往期栏目 个人博客网站搭建_为了前进而后退&#xff0c;为了走直路而走弯路的博客-CSDN博客 【Node…...

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型&#xff08;例如神经网络模型和人脑模型&#xff09;的差异。 交叉熵&#xff0c;顾名思义&#xff0c;与熵有关&#xff0c;先把模型换成熵这么一个数值&#xff0c;然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…...

基于随机森林回归预测葡萄酒质量

基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理&#xff08;标准化、划分训练/测试集&#xff09;3.4模型训练与优化&#xff08;随机森林回归 超参…...

【Qt】QWidget属性2

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1. windowOpacity属性2. cursor属性2.1 自定义光标 3. font属性4.tooltip属性5. focusPolicy属性6. 总结 由于QWidget的常见属性实在太多&a…...

OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap

乒乓缓冲核心思想 不使用乒乓缓冲&#xff0c;如果要每个滤镜作用下的绘制内容&#xff0c;也就是这个滤镜作用下的帧缓冲&#xff0c;需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲&#xff0c;只用两个Frame Buffer Object加上对应的F…...

数据库练习2

目录 1.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 2.课堂代码练习 3.题目如下 一、单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4…...