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 可以参考…

开源项目学习(6)---- CMake 可执行文件生成

CMake 基础DEMO 标题 CMake 基础DEMO可执行文件的生成最简单的可执行文件实例使用变量定义生成目标添加宏定义设置可执行文件的路径自动寻找依赖库 打印信息CMake 常见编译选项 可执行文件的生成 最简单的可执行文件实例 cmake_minimum_required(VERSION 3.22) project(tonyd…

图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;左外连接、右外连接&…

LeetCode-day08-881. 救生艇

LeetCode-day08-881. 救生艇 题目描述示例示例1&#xff1a; 思路代码 题目描述 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多…

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

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

NTP网络时间服务器_安徽京准电钟

NTP网络时间服务器_安徽京准电钟 NTP网络时间服务器_安徽京准电钟 概述 NTP网络时间服务器是一款支持NTP和SNTP网络时间同步协议&#xff0c;高精度、大容量、高品质的高科技时钟产品。 NTP网络时间服务器设备采用冗余架构设计&#xff0c;高精度时钟直接来源于北斗、GPS系统中…

HTML LocalStorage

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

大学生如何学习C语言编程?

设计语言》&#xff08;K&R&#xff09;和《C Primer Plus》。 安装开发环境&#xff1a;安装一个C语言编译器&#xff0c;如GCC&#xff0c;以及一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;比如Code::Blocks或Visual Studio。 学习语法&#xff1a;熟悉C语…

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;点击效果控件 在淡入结束的…

C++ 中有符号数与无符号数的隐式转换与运算陷阱

尽管我们不会故意给无符号对象赋一个负值&#xff0c;却可能写出这样的代码。例如&#xff0c;当一个算术表达式既有无符号数又有int值时&#xff0c;那个int值就会转换成无符号数。把int转换成无符号数的过程和把int直接赋给无符号变量一样&#xff1a; #include <iostrea…

DevExpress学习系列文章

一&#xff1a;DevExpress Installed 二&#xff1a;Application UI 三&#xff1a;Data Management Controls 四&#xff1a;Skins 系列文章相关代码&#xff1a;DevExpressDemo: DevExpress学习过程中的Demo

react项目--博客管理

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

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

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

成功解决No module named ‘sklearn’(ModuleNotFoundError)

成功解决No module named ‘sklearn’(ModuleNotFoundError) &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f…