springboot+AOP+RBAC自定义权限访问控制03

news2024/12/24 20:36:41

springboot+AOP+RBAC自定义权限访问控制03!今天我们做完了整个权限管理的内容。

内容比较多。请大家有足够的耐心看完。

首先。我们为了测试权限的鉴别效果,我们提前准备了一个新闻实体类,对应数据库的tb_news数据表。

我们提前准备好了新闻的管理层控制器,业务层接口,持久层接口等。目的就是为了测试,当角色身份不争取的情况,是否可以请求到这个接口?

下面是验证的整个流程。

导入依赖包:spring-boot-starter-aop

由于我们设置过了parent参数,所以版本号就可以忽略了。



新闻表的内容。很简单。

 

我们使用了一个产品管理员+vip会员的角色账号,来请求新闻的业务接口。试验一下。我们自定义的权限访问系统能不能生效即可。


package com.yrl.managedemo.aspect;

import com.yrl.managedemo.anno.PreAuthorize;
import com.yrl.managedemo.bean.Role;
import com.yrl.managedemo.bean.User;
import com.yrl.managedemo.service.IUserService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;

@Component
@Aspect
public class AuthorizeAspect {


    @Autowired
    private IUserService userService;

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private HttpServletResponse response;

    //配置切入点
    @Pointcut("@annotation(com.yrl.managedemo.anno.PreAuthorize)")
    public void authorizePointCut(){

    }

    /**
     * 后端菜单资源鉴权:
     * 1:查询用户的所有接口资源权限列表
     * 2:获取当前接口资源的访问权限标识符
     * 3:比较
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around("authorizePointCut()")
    public Object handle(ProceedingJoinPoint pjp) throws Throwable {
        //1:查询用户所有接口的资源权限列表
        //从请求头中模拟用户id
        String id = request.getHeader("user_id");
        List<Role>  perms = userService.getOneUserByUserId(Integer.valueOf(id)).get(0).getRoleList();

        //2:获取当前接口资源的访问权限标识符
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        PreAuthorize annotation = method.getAnnotation(PreAuthorize.class);
        String methodPermission = annotation.value();
        //3:比较
        boolean result = perms.contains(methodPermission);
        //4:如果当前用户没有当前接口的权限,403/抱歉,您无权访问
//        if(!result){
//            response.setContentType("application/json;charset=UTF-8");
//            response.setStatus(403);
//            response.getWriter().write("抱歉,您无权访问");
//        }

        try (ServletOutputStream outputStream = response.getOutputStream()) {
            if(!result){
                response.setContentType("application/json;charset=UTF-8");
                response.setStatus(403);
                outputStream.print("抱歉,您权限不够");
            }

        } catch (IOException ex) {

        }

        //5:末尾的返回是交付给目标方法。甚至我们还可以拿到它的内容,修改后再交付回去。
        return pjp.proceed();
    }
}

 如图,这个是我们 自定义的一个权限访问类,里面我们已经把它提前做好了配置。

整体思想,就是2大步骤,第一步,定义切入点。第二步,定义好切入点的通知模式。我们这次采用的环绕通知。里面写好了具体的业务判定逻辑。

判定逻辑里面写的很清晰了,不再一一介绍了。


我们定义的鉴权业务类,在这个文件夹下面存放。

 


 

如图,我们使用postman接口测试软件来进行接口的调用。

我们在headers里面配置了用户的id,模拟真实的场景。

提交后,我们开启了调试模式。启动了服务器。

逐步排查数据变化情况。F7(按键)一步一个函数的去执行。

 

如图,我们已经拿到了用户的id为3.查询到了该用户的权限情况。经过判定,不吻合业务要求。所以返回了result为false.意味着当前登录的用户,是无权访问该接口地址的。

 

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

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

相关文章

【Android 字节码插桩】Gradle插件基础 Transform API的使用

前言 啪~我给大家开个会&#xff08;手机扔桌子上&#xff09; 什么叫做 客户无感的数据脱敏&#xff01;&#xff1f; 师爷给翻译翻译什么叫做客户无感的数据脱敏&#xff1f; 什么特么的叫做客户无感数据脱敏&#xff1f; 举个栗子~ 客户端Sdk新升级了一个版本&#xff0c;增…

150基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数

基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数&#xff0c;根据其原理输出推程和回程的最大压力角、最小曲率半径等相关结果。程序已调通&#xff0c;可直接运行。 150 凸轮轮廓的设计 结构的最优化参数 (xiaohongshu.com)

EasyExcel使用,实体导入导出

简介 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中…

数据结构:图文详解 搜索二叉树(搜索二叉树的概念与性质,查找,插入,删除)

目录 搜索二叉树的相关概念和性质 搜索二叉树的查找 搜索二叉树的插入 搜索二叉树的删除 1.删除节点只有右子树&#xff0c;左子树为空 2.删除节点只有左子树&#xff0c;右子树为空 3.删除节点左右子树都不为空 搜索二叉树的完整代码实现 搜索二叉树的相关概念和性质 …

Java设计模式-组合模式(13)

大家好,我是馆长!今天开始我们讲的是结构型模式中的组合模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。 组合模式(Composite Pattern) 定义 组合(Composite)模式:又叫…

【大厂AI课学习笔记】1.3 人工智能产业发展(2)

&#xff08;注&#xff1a;腾讯AI课学习笔记。&#xff09; 1.3.1 需求侧 转型需求&#xff1a;人口红利转化为创新红利。 场景丰富&#xff1a;超大规模且多样的应用场景。主要是我们的场景大&#xff0c;数据资源丰富。 抗疫加速&#xff1a;疫情常态化&#xff0c;催生新…

(十一)springboot实战——springboot3下关于WebFlux项目的一些常用功能整合

前言 本节内容主要是对webflux项目一些常用功能的介绍&#xff0c;例如系统集成swagger接口文档&#xff0c;方便接口测试以及前后端项目联调测试&#xff1b;使用actuator完成系统各种指标的监控功能&#xff1b;系统使用logback日志框架完成项目日志的收集&#xff1b;使用过…

reactnative 调用原生ui组件

reactnative 调用原生ui组件 ![组件对应关系](https://img-blog.csdnimg.cn/direct/c4351ad7bd38411e9c13087f1059a4b0.png)1.该样例已textView,介绍。 新建MyTextViewManager 文件,继承SimpleViewManager。import android.graphics.Color; import android.widget.TextView;…

redis设计与实践的总结

Redis是一款高性能的Key-Value存储系统&#xff0c;它可以用作缓存、消息队列、计数器、排行榜等多种应用场景。在实际应用中&#xff0c;如何设计和使用Redis是非常关键的。本文将介绍Redis的设计原则和最佳实践&#xff0c;帮助您更好地利用Redis提高应用性能和可靠性。 ###…

【Linux】文件基础、文件系统调用接口、文件描述符

目录 文件基础 系统调用接口 open close write 实现文件写入 实现文件内容追加 read 实现文件读取 文件描述符fd 文件基础 1.空文件&#xff0c;也要在磁盘占用空间。 2.文件内容属性 3.文件操作&#xff1a;是单独对于内容或属性、或者内容和属性 4.文件路径文件名&…

C++ 菱形继承和虚拟菱形继承

菱形继承和虚拟菱形继承 菱形继承1. 概念2. 产生的问题 虚拟菱形继承1.1 使用1.2 原理 菱形继承 1. 概念 菱形继承是多继承的一个特殊情况&#xff0c;多继承是指一个子类类继承了两个或以上的直接父类&#xff0c;而菱形继承问题的产生是因为该子类的父类&#xff0c;继承了…

MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数

MTK8365安卓核心板是一款高性能的嵌入式处理器产品&#xff0c;基于联发科领先的SoC架构和先进的12纳米工艺。它集成了四核ARM Cortex-A53处理器&#xff0c;每个核心频率高达2.0 GHz&#xff0c;搭载强大的多标准视频加速器&#xff0c;支持高达1080p 60fps的视频解码。此外&a…

SpringBoot使用当前类代理类(内部事务)解决方案

文章目录 一、场景描述二、解决方案1. 使用 Lazy&#xff08;推荐&#xff09;2. 使用方法注入3. 使用 ApplicationContext4. 分离服务层5. AspectJ 代理模式 在 Spring Boot 开发中&#xff0c;我们时常遇到需要在一个类的内部调用自己的其他方法&#xff0c;并且这些方法可能…

一步步教大家在windows环境下搭建SkyWalking,百分百成功(内附spring boot demo工程源码)

本文详细的介绍了skywalking在Win10上的环境安装过程&#xff0c;es 、oap 和应用jar包都在一台机器上运行。其中文章中提供了es、oap、agent、以及springboot demo工程的下载链接。相信刚接触Skywalking的同学&#xff0c;只需要按照本文内容一步步操作就会完成skywalking的环…

Kotlin 协程:深入理解 ‘async { }‘

Kotlin 协程&#xff1a;深入理解 ‘async { }’ Kotlin 协程是一种强大的异步编程工具&#xff0c;它提供了一种简洁、易读的方式来处理并发和异步操作。在 Kotlin 协程库中&#xff0c;async {} 是一个关键的函数&#xff0c;它允许我们启动一个新的协程&#xff0c;并返回一…

[Python-闫式DP]

闫式DP分析法 闫老师是将DP问题归结为了有限集合中的最值问题。 动态规划有两个阶段&#xff0c;一是状态表示&#xff0c;二是状态计算。 状态表示 f(i,j) 状态表示是一个化零为整的过程&#xff0c;动态规划的做题思路不是暴力法的每一个物品都去枚举&#xff0c;而是将相…

二叉树-堆应用(1)

目录 堆排序 整体思路 代码实现 Q1建大堆/小堆 Q2数据个数和下标 TopK问题 整体思路 代码实现 Q1造数据CreateData Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整&向下调整算法-CSDN博客 堆排序 整体思路 建堆&#xff08;直…

安全通道堵塞识别摄像机

当建筑物的安全通道发生堵塞时&#xff0c;可能会给人员疏散和救援带来重大隐患。为了及时识别和解决安全通道堵塞问题&#xff0c;专门设计了安全通道堵塞识别摄像机&#xff0c;它具有监测、识别和报警功能&#xff0c;可在第一时间发现通道堵塞情况。这种摄像机通常安装在通…

LeetCode--171

171. Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出:…

WebGL技术开发框架

WebGL技术框架是一些提供了便捷API和工具的库&#xff0c;用于简化和加速在Web浏览器中使用WebGL进行3D图形开发。以下是一些常用的WebGL技术框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Th…