Spring AOP 基于注解实现用户权限校验

主要注解

@interface:继承了 Annotation 接口的自定义注解,定义注释类型。

@Target:表示这个注解可以应用的地方,此处做权限校验是用在方法上的,所以此处的值为                          @Target(ElementType.METHOD)

@Retention:表示这个注解的保留策略,此处定义为 @Retention(RetentionPolicy.RUNTIME)

@Aspect:AOP依赖中的类,表示这个类是一个 Aspect,当应用程序中的其他组件和这个类中的方法相匹配时,spring 将自动执行这个方法,实现横切关注点的处理,此处横向关注点就是权限校验。

步骤

1. 引入依赖

引入 spring data starter AOP 依赖,版本对应项目的springboot 版本:Maven Repository: org.springframework.boot » spring-boot-starter-aop (mvnrepository.com)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>2.7.2</version>
</dependency>

2. 编写 身份接口注解

这个注解的主要用途是用于身份验证,确保用户具有适当的权限来执行特定的操作。

/*** 用户权限接口* 包含用户角色* target注解表示该注解可以用于方法上* retention注解表示该注解在运行时有效*/@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {/*** 用户有的身份,只要有身份就是true**/String[] anyRoles() default "";/*** 用户必须有的身份,比如会员,管理员*/String mustRole() default "";}

 3. 编写 AOP 切面类

/*** 权限校验拦截*/
@Aspect
@Component
public class AuthInterceptor {/*** 用户登录态键*/private String USER_LOGIN_STATE = "userLoginState";@Resourceprivate UserService userService;@Around("@annotation(authCheck)")public Object authCheck(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {//先获取当前用户登录态RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();//获取当前用户信息Object attribute = request.getSession().getAttribute(USER_LOGIN_STATE);User user=(User) attribute;if(user==null){return -1;}//获取用户权限String userRole = user.getUserRole();//获取用户角色列表String mustRole = authCheck.mustRole();List<String> anyRoles = Arrays.stream(authCheck.anyRoles()).filter(StringUtils::isNotBlank).collect(Collectors.toList());//判断当前用户权限是否在用户角色列表中if(CollectionUtils.isNotEmpty(anyRoles)){if (!anyRoles.contains(userRole)){System.out.println("当前用户为权限不足,无法访问该接口");return -1;}}//判断当前用户权限是否在必须权限中if(StringUtils.isNotBlank(mustRole)){if(!mustRole.equals(userRole)){System.out.println("当前用户为普通用户,无法访问该接口");return -1;}};//检验完毕,执行后续方法。跳出切面return joinPoint.proceed();}}

 

4.测试

在数据库直接添加一条数据

测试 mustRole 为 普通用户

在需要校验权限的接口添加注解。

    @AuthCheck(mustRole = "user")@PostMapping("/test")public void test(String string ){System.out.println("holleworld:"+ string);}

当权限校验通过就会输出 helloworld,失败就输出校验失败。

使用 swagger API 文档进行测试

测试 mustRole 为管理员

    @AuthCheck(mustRole = "admin")@PostMapping("/test")public void test(String string ){System.out.println("holleworld:"+ string);}

 

校验通过。

测试 anyRole 不包含

@AuthCheck(anyRoles = {"user","vip"})@PostMapping("/test")public void test(String string ){System.out.println("holleworld:"+ string);}
}

校验不通过。

测试 anyRole 包含

@AuthCheck(anyRoles = {"user","vip","admin"})@PostMapping("/test")public void test(String string ){System.out.println("holleworld:"+ string);}

校验通过。

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

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

相关文章

vue-cli是什么?和 webpack是什么关系?

前言 Vue CLI是Vue.js项目的官方脚手架&#xff0c;基于Node.js与Webpack构建。安装Vue CLI前需确保Node.js已安装&#xff0c;随后通过npm全局安装。Vue CLI能迅速创建和管理Vue.js项目&#xff0c;提升开发效率。而Webpack则负责资源打包&#xff0c;通过配置文件管理依赖、插…

自然语言处理:第三十四章Lora VS FineTuning

文章链接: [2405.09673] LoRA Learns Less and Forgets Less (arxiv.org) 这是一篇来自哥伦比亚大学和databricks对Lora 和FineTuning 更深一步的研究。有关于Lora可以参考我之前的文章: 自然语言处理: 第十二章LoRA解读_lora自然英语处理-CSDN博客 有关于fine_tuning 可以参考…

图Transformer 推荐系统

文章目录 Graph Transformer for Recommendation摘要引言相关工作方法3.1 Graph Invariant Rationale Learning3.1.1 Graph Collaborative Rationale Discovery3.1.2 Global Topology Information Injection3.1.3 Rationale Discovery with Graph Transformer.3.1.4 Task-Adapt…

【python】OpenCV—Histogram Matching(9.2)

学习来自OpenCV基础&#xff08;17&#xff09;基于OpenCV、scikit-image和Python的直方图匹配 文章目录 直方图匹配介绍scikit-image 中的直方图匹配小试牛刀风格迁移 直方图匹配介绍 直方图匹配&#xff08;Histogram Matching&#xff09;是一种图像处理技术&#xff0c;旨…

STM32Cube系列教程11:STM32 AES加解密模块性能测试

文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间&#xff0c;本次为不严谨测试&#xff0c;忽略了程序调用耗时&#xff0c;结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS…

MySQL—多表查询—练习(1)

一、引言 上几篇关于多表查询的基本几个部分全部学习完了。 多表查询的基本类型的查询包括以下&#xff1a; 1、内连接&#xff08;隐式内连接、显示内连接&#xff09;&#xff1a;... [INNER] JOIN ... ON 条件; &#xff09; 2、外连接&#xff08;左外连接、右外连接&…

数据库管理-第200期 身边的数据库从业者(20240610)

数据库管理200期 2024-06-10 数据库管理-第200期 身边的数据库从业者&#xff08;20240610&#xff09;首席-薛晓刚院长-施嘉伟邦德-王丁丁强哥-徐小强会长-吴洋灿神-熊灿灿所长-严少安探长-张震总结活动预告 数据库管理-第200期 身边的数据库从业者&#xff08;20240610&#…

HTML LocalStorage

一篇关于HTML本地存储的文章 Window.localStorage 只读的localStorage 属性允许你访问一个Document 源&#xff08;origin&#xff09;的对象 Storage&#xff1b;存储的数据将保存在浏览器会话中。 localStorage 类似 sessionStorage&#xff0c;但其区别在于&#xff1a;存储…

redis03 补充 redis驱动模型:事件驱动

1.文件事件 1.1 1.2 注&#xff1a; epoll是linux系统的底层IO多路复用技术 kqueue是mac的底层IO多路复用技术 在 Epoll 中&#xff0c;Epoll 就是事件通知器&#xff0c;可以向 Epoll 注册我们感兴趣的事件。 1.3 1.4

群体优化算法----火山爆发算法介绍以及离散优化Pareto最优解示例

介绍 火山爆发算法&#xff08;Volcano Eruption Algorithm&#xff0c;VEA&#xff09;是一种新兴的群智能优化算法&#xff0c;其灵感来源于火山爆发的自然现象。火山爆发算法模拟了火山爆发过程中熔岩流动和喷发的行为&#xff0c;以寻找全局最优解。这种算法利用了火山爆发…

PR如何让音频淡入淡出

PR如何让音频淡入淡出 方法一&#xff1a;效果控件关键帧方法二&#xff1a;音频轨道关键帧 以淡入为例&#xff0c;介绍如何设置淡入的两种方法&#xff0c;推荐使用第二种。淡出效果类似。 方法一&#xff1a;效果控件关键帧 选中音频&#xff0c;点击效果控件 在淡入结束的…

react项目--博客管理

文章目录 技术栈登录存信息配置tokenhooks使用路由配置各页面技术总结首页发布文章文章详情页 个人主页分类页 本篇文章总结一个开发的react项目—博客系统 技术栈 React、react-redux、react-router 6&#xff0c;Ant Design&#xff0c;es6&#xff0c;sass&#xff0c;webp…

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表

前言 友友们是否常常因为杂乱的数据而烦恼?数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间?这篇博客将为友友们带来一个新的解决方案,让我们共同学习如何运用RPA数据整理机器人,实现杂乱数据的快速整理,为你的工作减负增效! 在这里,友友们将了…

AI 边缘计算平台 - 回归开源 BeagleY-AI 简介

BeagleBoard.org 于 3 月 27 号发布了一款单板计算机 BeagleY-AI &#xff0c;这款 SBC 凭借其完全开源的特性&#xff0c;旨在激发并推动开源社区的生态系统繁荣发展。 一、简介&#xff1a; BeagleY-AI 采用德州仪器新推出的 AM67A AI 视觉处理器。这款处理器集成了四个 64…

UE5基础1-下载安装

目录 一.下载 二.安装 三.安装引擎 四.其他 简介: UE5&#xff08;Unreal Engine 5&#xff09;是一款功能极其强大的游戏引擎。 它具有以下显著特点&#xff1a; 先进的图形技术&#xff1a;能够呈现出令人惊叹的逼真视觉效果&#xff0c;包括高逼真的光影、材…

Redis原理篇——哨兵机制

Redis原理篇——哨兵机制 1.Redis哨兵2.哨兵工作原理2.1.哨兵作用2.2.状态监控2.3.选举leader2.4.failover 1.Redis哨兵 主从结构中master节点的作用非常重要&#xff0c;一旦故障就会导致集群不可用。那么有什么办法能保证主从集群的高可用性呢&#xff1f; 2.哨兵工作原理 …

CDR2024软件破解Keygen激活工具2024最新版

CorelDRAW Graphics Suite2024最新版&#xff0c;这是一款让我爱不释手的图形设计神器&#xff01;作为一个软件评测专家&#xff0c;我一直在寻找一款能够提升我的设计效率和创造力的工具。而这款软件&#xff0c;简直就是为我量身定制的&#xff01;&#x1f389; 「CorelDR…

插卡式仪器模块:示波器模块(插卡式)

• 12 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 可实现信号分析 • 上电时序测量 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比对 • 无线充电&#xff08;信号解调&#xff09; 通道12输入阻抗Hi-Z, 1 MΩ…

matlab使用教程(95)—显示地理数据

下面的示例说明了多种表示地球地貌的方法。此示例中的数据取自美国商务部海洋及大气管理局 (NOAA) 国家地理数据中心&#xff0c;数据通告编号为 88-MGG-02。 1.关于地貌数据 数据文件 topo.mat 包含地貌数据。topo 是海拔数据&#xff0c;topomap1 是海拔的颜色图。 load t…

web前端:作业二

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 1.将ul的子l…