自己开发完整项目一、登录功能-05(动态权限控制)

news2024/9/21 19:00:09

一、上节回顾

在上一节中,我们介绍了如何通过数据库查询用户的权限,并对方法级别的接口使用注解的方式进行权限控制,之后通过用户携带的tocken进行解析权限,判断是否可以访问。


具体步骤:
1.在查询用户信息的时候将用户权限查询出来,并给前端返回一个tocken。

2.编写一个后端过滤:作用主要是通过自定义的jwt工具将tocken进行解析,将解析出来的权限信息告诉给springsecurity。

3.将自定义的过滤器加载到springsecurity中的过滤器链中。

4.在方法级别的接口上通过@PreAuthorize("hasAnyAuthority('qxgl')")  //需要的权限进行权限控制。

5.访问验证


那么上述方案有一个问题,在真实项目中,接口是非常多的,并且通过注解的方式进行权限控制的话,那么当接口权限发生变化的时候,改动量是非常大的,所以我们需要动态的设置接口权限。

二、动态权限的实现思路

1.每一个页面或者是按钮都有一个访问接口,那么我们就需要在menu表中增加访问接口的字段。

2.编写一个类实现AuthorizationManager接口,在这个接口中,我们需要查询出当前访问接口所需要的权限,然后根据当前用户的权限进行比对,如果有则放行。

2.在springsecurity的配制文件中,添加access配置并传入自定义类

 三、动态权限实现步骤

1..每一个页面或者是按钮都有一个访问接口,那么我们就需要在menu表中增加访问接口的字段。

CREATE TABLE `menu` (
  `id` int NOT NULL COMMENT 'id',
  `menu_name` varchar(255) DEFAULT NULL COMMENT '权限名称',
  `menu_tag` varchar(255) DEFAULT NULL COMMENT '权限标签',
  `parent_id` int DEFAULT NULL COMMENT '父id',
  `menu_type` int DEFAULT NULL COMMENT '权限类型(1:目录,2:菜单,3:按钮)',
  `is_deleted` int DEFAULT NULL COMMENT '是否删除',
  `path` varchar(255) DEFAULT NULL COMMENT '访问路径',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

2.编写一个类实现AuthorizationManager接口,在这个接口中,我们需要查询出当前访问接口所需要的权限,然后根据当前用户的权限进行比对,如果有则放行。

 

package com.ljy.myspringbootlogin.filter;


/**
 * 这个类主要作用:实现动态权限
 * 1.实现AuthorizationManager
 * 2.重写其中的check()方法
 * 3.获取前端的请求路径(其中登录接口不需要认证)
 * 4.根据请求路径查询所需要的权限
 */


/**
 * RequestAuthorizationContext  我们需要从这里取出请求接口路径
 */

import com.ljy.myspringbootlogin.model.MenuModel;
import com.ljy.myspringbootlogin.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.access.intercept.RequestAuthorizationContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.function.Supplier;
import java.util.stream.Collectors;

@Component
public class SpringSecurityAuyhorizationManager implements AuthorizationManager<RequestAuthorizationContext> {
@Autowired
    IMenuService iMenuService;

    @Override
    public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext requestAuthorizationContext) {
       //获取前端的请求路径
        HttpServletRequest request = requestAuthorizationContext.getRequest();
        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("uri: "+requestURI);
        System.out.println("url: "+requestURL);

        //登录接口不需要认证
        if("/sys/login".equals(requestURI)){
            return new AuthorizationDecision(true);
        }

        //根据前端的请求路径查询menu
        MenuModel menuByPath = iMenuService.getMenuByPath(requestURI);
        if(menuByPath==null){
            return new AuthorizationDecision(false);
        }

        //获取所需要的权限
        String menuTag = menuByPath.getMenuTag();
        System.out.println("路径权限:"+menuTag);
        if(menuTag == null || menuTag.trim().equals("")){
            return new AuthorizationDecision(true);
        }

        //和用户的权限集合进行判断
        Collection<? extends GrantedAuthority> authorities = authentication.get().getAuthorities();
        for (GrantedAuthority authority : authorities) {
            String userParam = authority.getAuthority();
            System.out.println("用户权限:"+userParam);
            if(userParam.equals(menuTag)){
                return new AuthorizationDecision(true);
            }
        }

        return new AuthorizationDecision(false);

    }
}

3.在springsecurity的配置文件中配置

 

http.authorizeHttpRequests()
                .antMatchers("/sys/**").permitAll()
//                .anyRequest().authenticated();
        .anyRequest().access(springSecurityAuyhorizationManager);   //动态实现权限

4.测试

 

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

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

相关文章

神经网络中激活函数介绍、优缺点分析

本文主要介绍神经网络中的常用的激活函数 激活函数是神经网络中用于引入非线性模型&#xff0c;提升模型泛化能力的函数 非线性激活函数至关重要&#xff0c;它可以让神经网络学习复杂特征、提供模型复杂度 1、激活函数定义 激活函数是神经网络模型中的一种非线性函数&#xf…

教学能力知识

第一章课程理论知识 一、课程理念 二、课程目标 1.核心素养 2.课程总目标 三、教学建议 四、教学环节 第二章教学实施 第一节导入新课类 二.导入方法 第二节教学方法类 教学方法的选择依据 第三节教法实施原则类 设计意图 第四节设计意图类 1.教学目标 2.教学重难点 3.教学…

【安当产品应用案例100集】014-使用安当TDE实现达梦数据库实例文件的透明加密存储

随着数据安全重要性的不断提升&#xff0c;数据库文件的落盘加密已成为数据保护的一项基本要求。达梦数据库作为一款高性能的国产数据库管理系统&#xff0c;为用户提供了一种高效、安全的数据存储解决方案。本文将详细介绍如何利用安当KSP密钥管理平台及TDE透明加密组件来实现…

[数据集][目标检测]灭火器检测数据集VOC+YOLO格式3255张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3255 标注数量(xml文件个数)&#xff1a;3255 标注数量(txt文件个数)&#xff1a;3255 标注…

c++多线程下崩溃一例分析 ACTIONABLE_HEAP_CORRUPTION heap failure block not busy DOUBLE

之前的三个代码接口使用了同一把锁&#xff0c;共享资源的访问是有序执行的没有问题。最近改成各个接口使用单独的锁&#xff0c;结果漏掉了共享资源的保护&#xff0c;于是出现了崩溃。最近与这个崩溃做斗争并定位找到的原因&#xff0c;成功复现了。这里总结下&#xff0c;后…

[YM]课设-C#-WebApi-Vue-员工管理系统 (六)前后端交互

Http状态码&#xff1a; 终于也是到了前端 上文提到http状态码 这里详细说一下 1xx 表示临时响应并需要请求者继续执行操作 2xx 成功&#xff0c;操作被成功接收并处理 3xx 表示要完成请求&#xff0c;需要进一步操作。 通常&#xff0c;这些状态代码用来重定向 4…

LiveQing视频点播流媒体RTMP推流服务用户手册-分屏展示:单分屏、四分屏、九分屏、十六分屏、轮巡播放、分组管理、记录加载

LiveQing视频点播流媒体RTMP推流服务用户手册-分屏展示:单分屏、四分屏、九分屏、十六分屏、轮巡播放、分组管理、记录加载 1、分屏展示1.1、分组管理1.1.1、新建分组1.1.2、选择资源1.1.3、编辑分组1.1.4、删除资源 1.2、多分屏1.2.1、选择资源1.2.2、单分屏1.2.3、四分屏1.2.…

【多模态大模型】的正确打开方式——图片

早期痛点 识别图片中的物体&#xff0c;早期可以使用Yolo 但是缺点也很明显&#xff1a; 训练时间长成本高泛华性能差通用识别领域覆盖有限 优点&#xff1a; 特殊领域识别 大模型出现 大模型出现后&#xff0c;一些大模型对接了图片识别相关的模型&#xff0c;实现了图片…

利用衍射进行材料分析--Muad

软件介绍 MAUD是一款免费软件&#xff0c;使用组合 Rietveld 方法分析衍射数据。其功能不仅限于衍射&#xff0c;还包括荧光和反射率。 它可以分析来自 X 射线源以及中子、TOF 和 TEM 电子的数据。相含量和晶体结构、微观结构特征&#xff08;如尺寸和应变&#xff09;、晶体…

沉浸式体验亚马逊云科技上私有化部署零一万物AI大模型

小李哥将继续带大家沉浸式体验亚马逊云科技上的国产AI大模型。最近亚马逊云科技的机器学习模型管理平台Amazon SageMaker JumpStart 上线了由零一万物提供的基础模型 Yi-1.5 6B/9B/34B&#xff0c;这也是首批登陆中国区 Amazon SageMaker JumpStart 的中文基础模型&#xff0c;…

【多线程】并发编程wait和sleep的区别

notyfy、notifyAll、wait的使用&#xff1a;sleep/wait/notify/notifyAll分别有什么作用 背景&#xff1a;之前的博客讲解到了notify的使用&#xff0c;那并发编程的时候&#xff0c;到底该用 sleep还是notify呢&#xff1f;本篇我们来一起梳理一下区别 所属类与方法类型 wait…

vscode+django开发后端快速测试接口(轻量版,免postman安装)

目录 背景 步骤 安装插件 编写测试文件 示例一&#xff1a;get接口类型 示例二&#xff1a;post接口类型 示例三&#xff1a;delete接口类型 如何运行test.http测试文件 背景 在最近工作中涉及到使用Django框架开发后端&#xff0c;写完接口后&#xff0c;不可避免需要…

php法律事务综合管理系统Java律师事务所业务流程管理平台python法律服务与案件管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

Java八股文总结一

Java基础 一、JDK、JRE、JVM之间的关系&#xff1f; 1、JDK(Java Development Kit):Java开发工具包&#xff0c;提供给Java程序员使用&#xff0c;包含了JRE&#xff0c;同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。 2、JRE(Java Runtime Environment):Ja…

蔡司小乐圆镜片:自由环面与微柱镜排布助力兼顾舒适与效果

从学习到休闲娱乐&#xff0c;孩子们的日常生活已与电子设备密不可分&#xff0c;视力面临日益严峻的挑战。为了让孩子拥有全视野清晰视觉体验的同时&#xff0c;更有效管理孩子的近视发展&#xff0c;让孩子佩戴蔡司小乐圆镜片&#xff0c;也成为不少家长的首选。 数据统计&am…

opencv图像形态学(边缘检测算法实例)

引言 图像形态学是一种基于数学形态学的图像处理技术&#xff0c;它主要用于分析和修改图像的形状和结构。在OpenCV中&#xff0c;图像形态学操作通过一系列的数学运算来实现&#xff0c;如腐蚀、膨胀、开运算、闭运算等。这些操作在图像处理、计算机视觉和模式识别等领域有着…

Python自动化必会技能-Excel文件读取

01 重点 在自动化测试过程中&#xff0c;经常需要使用excel文件来存储测试用例&#xff0c;那么在表格内设计好了测试用例数据后&#xff0c;如何通过自动化读取呢&#xff1f;此时就需要测试小姐姐动手写“代码”了~ 本文主要介绍通过python来读取表格数据。Python读取表格的…

C语言的函数递归

目录 前言 一、递归是什么&#xff1f; 1. 递归的思想 2. 递归的限制条件 二、递归举例 1. 求n的阶乘 1.1 思路分析 1.2 画图推演 2. 顺序打印⼀个整数的每⼀位 2.1 思路分析 2.2 画图推演 三、递归与迭代 四、求第n个斐波那契数 总结 前言 我们在函数上已经非常…

《父母爱情》:找结婚对象,别只看有房有车有颜,这4个特点更重要!

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 最近&#xff0c;我重温了电视剧《父母爱情》&#xff0c;不禁被剧中人物的情感纠葛和生活琐事深深吸引。 在当今社会&#xff0c;许多人在选择结婚对象时&#xff0c;往往只关注房子、车子、颜值&#xff0…

2020年B题高穿越沙漠教社杯全国大学生数学建模竞赛题目与分析

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ​ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…