【Spring EL<二>✈️✈️ 】SL 表达式结合 AOP 注解实现鉴权

目录

🍻前言

🍸一、鉴权(Authorization)

🍺二、功能实现

        2.1 环境准备

        2.2 代码实现

        2.3 测试接口

🍹三、测试功能

        3.1 传递 admin 请求

​        3.2 传递普通 user 请求

🍻四、章末


🍻前言

        小伙伴们大家好,最近有一段时间没更了,有一部分是工作上的原因,还有一部分生活上的小事给耽搁了,之前的文章链接如下,这次继续来学习下 Spring EL 表达式的另一种方式,结合切面类实现鉴权的功能;

【Spring EL<一>✈️ 】SL 表达式的应用-CSDN博客

🍸一、鉴权(Authorization)

       也称为授权,是系统安全中的一个重要环节。用于确定已经通过认证的用户是否有权限访问某个资源或执行某个操作。鉴权确保只有具有适当权限的用户可以执行特定的操作,从而保护系统的资源和数据。

下面是一些常见的鉴权方式

  1. 基于角色的访问控制(RBAC)

    • 用户被赋予一个或多个角色,每个角色拥有一组权限。
    • 鉴权时根据用户的角色来决定其是否有权限执行某操作。
  2. 基于属性的访问控制(ABAC)

    • 检查用户属性、环境属性、资源属性等多种因素。
    • 使用这些属性和策略规则来进行复杂的鉴权决策。
  3. 访问控制列表(ACL)

    • 每个资源有一个列表,列出哪些用户或系统进程对该资源有哪些权限。
    • 直接针对资源的授权管理。

🍺二、功能实现

        本地实现的是基于角色访问控制的鉴权

        2.1 环境准备

        创建一个简单的 Springboot 项目,确保可以正常启动

        引入AOP 的依赖以及打开使用权限

        2.2 代码实现

                2.2.1 注解定义

                简单定义了一个注解,指明了该注解的作用域为方法上,并且运行时可存在

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckPermission {
    String value();
}

                 2.2.2 注解切面类实现

                这里没有使用切入点(@PointCut),是因为该切面类中只有一个 @Before 操作,如果有多个操作,适合使用 @PointCut 标注,就不用每个方法上都加 "@annotation(com.example.demo.testCode.springel.CheckPermission)" 了

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
public class PermissionAspect {
    @Before("@annotation(com.example.demo.testCode.springel.CheckPermission)")
    public void checkUserPermission(JoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        CheckPermission checkPermission = method.getAnnotation(CheckPermission.class);

        String spelExpression = checkPermission.value();

        // 使用Spring EL表达式解析器
        ExpressionParser parser = new SpelExpressionParser();
        StandardEvaluationContext context = new StandardEvaluationContext();

        // 将方法参数放入上下文中
        Object[] args = joinPoint.getArgs();
        String[] paramNames = signature.getParameterNames();
        for (int i = 0; i < args.length; i++) {
            context.setVariable(paramNames[i], args[i]);
        }

        // 模拟权限检查逻辑
        Boolean hasPermission = parser.parseExpression(spelExpression).getValue(context, Boolean.class);

        if (!hasPermission) {
            throw new SecurityException("User does not have permission to perform this action");
        }
    }

}
        2.3 测试接口

       简单的暴露一个接口供测试使用,这里使用的 SpringEL 表达式是“identity == admin" ,就是简单的判断下当前访问该接口的用户的身份是否为 admin,当然这只是一个接口,别的接口可以随意改变鉴权方式以及权限要求

@GetMapping("/checkPermission")
    @CheckPermission(value = "#identity == 'admin'")
    public void checkPermission(String identity){
        // 业务逻辑
        System.out.println("Reading sensitive data for user: " + identity);
    }

🍹三、测试功能

        3.1 传递 admin 请求

        模拟 admin 用户访问该接口,结果如图,通过了切面类的 SpringEL 表达式校验

         3.2 传递普通 user 请求

       模拟普通用户请求访问该接口,结果如图所示,普通用户请求被拦截

         这里只是简单的打印了日志,实际应用中可操作空间很大,比如不同的用户执行不同的业务逻辑,或者不同的用户抛出不同的异常信息,再用全局异常处理器实现不同的提示操作等

🍻四、章末

        文章到这里就结束了~ 

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

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

相关文章

eFuse电子保险丝,需要了解的技术干货来啦

热保险丝作为一种基本的电路保护器件&#xff0c;已经成功使用了150多年。热保险丝有效可靠、易用&#xff0c;具有各种不同的数值和版本&#xff0c;能够满足不同的设计目标。然而&#xff0c;对于寻求以极快的速度切断电流的设计人员来说&#xff0c;热保险丝不可避免的缺点就…

t265 jetpack 6 px4 ros2

Ubuntu22.04 realsenseSDK2和ROS2Wrapper安装方法,包含T265版本踩坑问题_ros2 realsense-CSDN博客 210 git clone https://github.com/IntelRealSense/librealsense.git 212 git branch 215 git tag 218 git checkout v2.51.1 219 git branch 265 git clone https://…

法考报名照片审核不通过?原因看过来

法考报名照片审核不通过&#xff1f;原因看过来&#x1f440;

API工具--Apifox和Postman对比(区别)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Python 俄罗斯方块小游戏【含Python源码 MX_007期】

系统简介&#xff1a; 俄罗斯方块是一款经典的俄罗斯益智游戏&#xff0c;由苏联工程师阿列克谢帕基特诺夫&#xff08;Alexey Pajitnov&#xff09;于1984年创建。在游戏中&#xff0c;玩家需要操纵不同形状的方块&#xff0c;以水平移动和旋转的方式&#xff0c;使它们在屏幕…

Python学习从0开始——Kaggle时间序列002

Python学习从0开始——Kaggle时间序列002 一、作为特征的时间序列1.串行依赖周期 2.滞后序列和滞后图滞后图选择滞后 3.示例 二、混合模型1.介绍2.组件和残差3.残差混合预测4.设计混合模型5.使用 三、使用机器学习进行预测1.定义预测任务2.为预测准备数据3.多步骤预测策略3.1 M…

Pytorch安装

一、window 下载CUDA Driver nvidia-driver(NVIDIA驱动程序)是操作系统与NVIDIA GPU硬件之间的软件接口。它负责管理GPU硬件的操作、资源分配、性能优化等任务。CUDA依赖于NVIDIA的驱动程序,因为它需要与GPU硬件进行通信以执行并行计算任务。在使用CUDA进行开发时,确保安装了…

Qt多线程之moveToThread()函数

文章目录 一、moveToThread()执行后&#xff0c;当前代码线程没有改变。二、对象执行moveToThread()后&#xff0c;哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

基于改进下垂控制的微电网控制研究(matlab)

主要内容 该模型为simulink仿真模型&#xff0c;主要实现的内容如下&#xff1a; 模型比较全面&#xff0c;包括蓄电池、超级电容和光伏发电模块&#xff0c;同时包括阻性负载和冲击负载&#xff0c;能够较好的了解这些模块对于母线电压特性的研究。采用改进的下垂控制策略…

嘉之音真丝彩绘吸音画,把记忆与向往刻进艺术里

那一瞬间定格在记忆中 那一刹那感动到骨髓里 曾经 现在 将来 每一幅画&#xff0c;都是一个故事的开始&#xff0c;一段记忆的延续&#xff0c;它们承载着过去&#xff0c;映照着现在&#xff0c;启迪着未来。在艺术的世界里&#xff0c;每个人都能找到属于自己的那一幅画…

STM32F103ZET6_HAL_CAN

1定义时钟 2定义按键 按键上拉电阻 3开启串口 4打开CAN&#xff08;具体什么意思上一篇讲了&#xff09; 5生成代码 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief …

HarmonyOS Next 系列之HTTP请求封装和Token持久化存储(四)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

2024年6月14日 十二生肖 今日运势

小运播报&#xff1a;2024年6月14日&#xff0c;星期五&#xff0c;农历五月初九 &#xff08;甲辰年庚午月己酉日&#xff09;&#xff0c;法定工作日。今天世界献血日&#xff0c;捐献新鲜血液&#xff0c;挽救更多生命&#xff0c;每位献血者都是英雄&#xff01; 红榜生肖…

云渲染动画:C4D如何正确渲染导出动画?

​C4D是一款功能强大的3D建模、动画和渲染软件&#xff0c;在制作动画时&#xff0c;正确的渲染和导出流程至关重要&#xff0c;以确保动画质量和流畅性。 帧率概念 动画就是一幅幅图片连贯起来&#xff0c;30帧/秒&#xff0c;就是一秒出现30张图片一般国外都是30&#xff0c…

打破数据分析壁垒:SPSS复习必备(一)

一、数据录入与数据获取 1.变量的测量尺度 &#xff08;1&#xff09;定类尺度 顾名思义&#xff0c;是对事物的类别或属性的一种测度&#xff0c;按照事物的某种属性对其进行分类或分组。 该类变量只能计算频数和频率&#xff0c;用表示 &#xff08;2&#xff09;定序尺…

table组件,前端如何使用table组件,打印数组数据,后端传输的数据应该如何打印

一、如何使用table&#xff0c;将数组数据打印出来 后端传来的数据&#xff0c;很大概率是一个List数组&#xff0c;我们必须用一个table组件&#xff0c;来打印这些数据。 table标签的介绍 在HTML中&#xff0c;table是常用组件之一&#xff0c;主要用来打印数组信息。 它的…

yolo-inference多后端+多任务+多算法+多精度模型 框架开发记录(python版)

先贴出github地址&#xff0c;欢迎大家批评指正&#xff1a;https://github.com/taifyang/yolo-inference 不知不觉LZ已经快工作两年了&#xff0c;由于之前的工作内容主要和模型部署相关&#xff0c;想着利用闲暇时间写一些推理方面的经验总结&#xff0c;于是有了这个工程。其…

【Pytorch】一文向您详细介绍 torch.nn.DataParallel() 的作用和用法

【Pytorch】一文向您详细介绍 torch.nn.DataParallel() 的作用和用法 下滑查看解决方法 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高…

postman 工具下载安装使用教程_postman安装

本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具&#xff0c;它提供了一个用户友好的界面&#xff0c;用于发送和测试API请求&#xff0c;并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…

深圳尚水智能IPO迷局:创始人不看好公司发展退出,比亚迪加入

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;深圳市尚水智能股份有限公司&#xff08;下称“尚水智能”&#xff09;及其保荐人民生证券撤回上市申请文件。因此&#xff0c;上海证券交易所决定终止对其首次公开发行股票并在科创板上市的审核。 据贝多财经了解&am…