基于 Spring AOP 实现安全检查
在现代应用程序中,安全性是一个至关重要的方面。通过对系统中的关键操作进行安全检查,可以有效防止未授权的访问和操作。Spring AOP(面向切面编程)提供了一种优雅的方式来实现安全检查,而无需修改业务逻辑代码。本文将通过具体的实例,演示如何使用 Spring AOP 实现安全检查。
1. 准备工作
首先,确保你的开发环境中已经配置好了以下内容:
- Java 开发环境(推荐 JDK 8 或以上版本)
- Maven 或 Gradle(本文使用 Maven 作为依赖管理工具)
- Spring Framework(本文基于 Spring 5.x 版本)
2. 创建 Maven 项目
我们首先创建一个 Maven 项目,定义基本的目录结构和依赖。
2.1 目录结构
在项目中创建如下目录结构:
spring-aop-security-check/
│
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── aspect/
│ │ │ │ └── SecurityAspect.java
│ │ │ ├── service/
│ │ │ │ ├── UserService.java
│ │ │ ├── util/
│ │ │ │ └── SecurityContext.java
│ │ │ └── MainApp.java
│ │ └── resources/
│ └── test/
│ └── java/
└── pom.xml
2.2 添加依赖
在 pom.xml 文件中添加 Spring AOP 的依赖:
<dependencies><!-- Spring AOP依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.10</version></dependency>
</dependencies>
3. 实现安全检查功能
接下来,我们将使用 Spring AOP 来实现安全检查功能。我们将创建一个简单的 UserService 类,然后定义一个 SecurityAspect 切面来进行安全检查。
3.1 编写 UserService 类
创建一个简单的服务类 UserService,包含两个方法:
package com.example.service;import org.springframework.stereotype.Service;@Service
public class UserService {public void addUser(String username) {System.out.println("Adding user: " + username);}public void deleteUser(String username) {System.out.println("Deleting user: " + username);}
}
3.2 创建 SecurityContext 工具类
为了模拟用户身份验证,我们创建一个 SecurityContext 工具类,用于存储当前用户的角色。
package com.example.util;public class SecurityContext {private static ThreadLocal<String> currentUser = new ThreadLocal<>();public static void setCurrentUser(String user) {currentUser.set(user);}public static String getCurrentUser() {return currentUser.get();}public static void clear() {currentUser.remove();}
}
3.3 创建 SecurityAspect 切面
现在,我们定义一个切面 SecurityAspect,用于在调用 UserService 方法前进行安全检查。
package com.example.aspect;import com.example.util.SecurityContext;
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.springframework.stereotype.Component;@Aspect
@Component
public class SecurityAspect {@Pointcut("execution(* com.example.service.UserService.*(..))")public void userServiceMethods() {}@Around("userServiceMethods()")public Object checkSecurity(ProceedingJoinPoint joinPoint) throws Throwable {String user = SecurityContext.getCurrentUser();if ("admin".equals(user)) {return joinPoint.proceed();} else {throw new SecurityException("Unauthorized user: " + user);}}
}
3.4 编写 MainApp 类测试
编写一个简单的 MainApp 类来测试我们的安全检查功能:
package com.example;import com.example.service.UserService;
import com.example.util.SecurityContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.example")
public class MainApp {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(MainApp.class);UserService userService = context.getBean(UserService.class);// 模拟以 admin 用户登录SecurityContext.setCurrentUser("admin");userService.addUser("Alice");userService.deleteUser("Bob");// 模拟以非 admin 用户登录SecurityContext.setCurrentUser("user");try {userService.addUser("Charlie");} catch (SecurityException e) {System.out.println(e.getMessage());}SecurityContext.clear();}
}
3.5 运行结果
运行 MainApp 类,输出如下:
Adding user: Alice
Deleting user: Bob
Unauthorized user: user
从输出结果可以看出,当以 admin 用户登录时,可以正常执行 UserService 的方法;而当以非 admin 用户登录时,系统抛出了 SecurityException,提示未授权用户。
4. 总结
通过本文的实例,我们演示了如何使用 Spring AOP 实现安全检查功能。通过定义切面和连接点,我们能够在不改动业务逻辑代码的情况下,添加额外的横切关注点(如安全检查),从而提高代码的模块化和可维护性。
相关文章:
基于 Spring AOP 实现安全检查
在现代应用程序中,安全性是一个至关重要的方面。通过对系统中的关键操作进行安全检查,可以有效防止未授权的访问和操作。Spring AOP(面向切面编程)提供了一种优雅的方式来实现安全检查,而无需修改业务逻辑代码。本文将…...
【MySQL】数据库事务详解
文章目录 前言1. 事务的定义2. 事务的四个特性2.1 原子性2.2 一致性2.3 隔离性2.4 持久性 3. 事务的并发问题3.1 脏读3.2 不可重复读3.3 幻读3.4 更新丢失 4. 事务的隔离级别5. 事务的使用结语 前言 假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱&…...
ubuntu链接mysql
C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…...
QStyledItemDelegate 和 QItemDelegate 的作用
在Qt中,QStyledItemDelegate和QItemDelegate是用于自定义和控制项视图控件(如QListView、QTableView、QTreeView)中项的显示和编辑的委托类。它们提供了对项的外观和编辑行为的定制能力。尽管它们在功能上有相似之处,但它们之间有…...
3.任务的创建与删除
1.什么是任务? 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务...
进程、CPU、MMU与PCB之间的关系
目录 进程与cpu(中央处理器) 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU(内存管理单元) mmu作用 cpu和mmu的关系 进程与PCB(进程控制块) PCB介绍与内部成员…...
代码随想录算法训练营Day50|1143.最长公共子序列、1035.不相交的线、53.最大子序和、392.判断子序列
最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 最长公共子序列 - 动态规划 Longest Common Subsequence - Dynamic Programming_哔哩哔哩_bilibili 本题和上一题718.最长重复子数组在很多方面相似…...
国家自然科学基金标书大全(2002-2024)
数据来源:在20世纪80年代初,为了促进中国的科技体制革新并改革科研资金分配机制,中国科学院的89位院士联名向党和国家领导人提出建议,设立了国家自然科学基金的设立。国自然基金自创立以来,根据国家发展科学技术方针、…...
Python代码打包成exe应用
目录 一、前期准备 二、Pyinstaller打包步骤 Pyinstaller参数详解 三、测试 Spec 文件相关命令 一、前期准备 (1)首先,我们需要确保你的代码可以在本地电脑上的pycharm正常运行成功。 (2)我们要先安装Pyinstalle…...
CesiumJS【Basic】- #016 多边形面渲染“花了”的问题
文章目录 多边形面渲染“花了”的问题1 目标2 问题代码3 修正后代码4 总结多边形面渲染“花了”的问题 1 目标 解决多边形的面“花了”的问题 2 问题代码 使用Cesium.PerInstanceColorAppearance渲染后出现色斑 import * as Cesium from "cesium";const viewer …...
qt 开发对信号槽进行二次封装,实现信号槽管理接口。
最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高 使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果, 想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一…...
本地项目上传到gitee
本地项目通过webstorm上传到gitee 1.登录gitee选择新建仓库 2.输入新建仓库的名字(名字与本地项目名一致) 3.复制链接 4.找到本地项目,选中地址输入cmd打开命令提示框 5.输入git init初始化git,生成.git文件 6.webstorm中打开项目…...
ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!
在当今数字化办公时代,一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件,凭借其全面的功能、优异的性能和出色的用户体验,为用户带来了超越想象的办公体验。下面,我们将对ON…...
中介子方程三十四
XXFXXuXXWXXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXWXπXXWXeXyXeXbXπXpXXNXXqXeXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXeXqXXNXXpXπXbXeXyXeXWXXπXWXuXXdXXrXXαXXuXpXXKXηXiXXαXXiXηXKXXpXuXXαXXrXXdXXuXXWXXuXXFXXEXXyXXEXXrXXαXXuXpXXK…...
最新Sublime Text软件安装包分享(汉化版本)
Sublime Text 是一款广受欢迎的跨平台文本编辑器,专为代码、标记和散文编辑而设计。它以其简洁的用户界面、强大的功能和高性能而著称,深受开发者和写作者的喜爱。 一、下载地址 链接:https://pan.baidu.com/s/1kErSkvc7WnML7fljQZlcOg?pwdk…...
AI-智能体基础设施
个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示,即:Agent大模型(LLM)记忆(Memory)主动规划(Planning)工具使用(Tool Use)。基于该公式&am…...
【docker】docker启动neo4j,并配置内存
注意下:--volume宿主机目录:/data 和 --publish宿主机port:7474 --publish宿主机port:7687 docker run -d \ --publish9801:7474 --publish9802:7687 \ --env NEO4J_AUTHneo4j/passwd \ --volume/opt/docker/data/vol-data/neo4j4.2:/data \ --restart always \ --…...
面试准备记录
6月26日 今日学习 MySQL的1-7题(中期报告,加上玩了游戏,就没有认真背题) 6月25日 今日复习 JVM的内存管理部分(1-31题) 6月24日 今日学习 类的生命周期?类加载过程?类加载器有…...
文件管理—linux(基础IO)
目录 编辑 一、C语言文件接口(库函数) hello.c写文件 hello.c读文件 输出信息到显示器 stdin & stdout & stderr 二、系统文件I/O(系统调用) hello.c 写文件: hello.c读文件 接口介绍 open open…...
【华为OD机试|01】最远足迹(Java/C/Py/JS)
目录 一、题目介绍 1.1 题目描述 1.2 备注: 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解: 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …...
除了 Docker 还能用什么?一文看懂容器技术的“四大门派”
除了 Docker 还能用什么?一文看懂容器技术的“四大门派” 在云原生时代,Docker 几乎成了容器的代名词。但实际上,容器技术是一片茂密的森林,除了 Docker,还有许多针对特定痛点(如安全、性能、隔离性&#x…...
告别在线安装卡顿:手把手教你离线部署Vitis 2021.2到Ubuntu 20.04(含77G包处理技巧)
高效离线部署Vitis 2021.2:Ubuntu 20.04全流程实战指南 对于从事FPGA开发的工程师而言,稳定可靠的开发环境搭建是项目成功的第一步。当网络条件受限或需要批量部署时,离线安装方式往往成为刚需。本文将深入解析如何在Ubuntu 20.04系统上完成V…...
从零构建智能体工作流引擎:核心架构、实现与生产级实践
1. 项目概述:从零构建一个智能体工作流引擎最近在GitHub上看到一个名为agentkit的项目,来自BCG X的官方仓库。这个标题立刻引起了我的兴趣,因为它直指当前AI应用开发中的一个核心痛点:如何高效、可靠地编排和管理多个AI智能体&…...
[Cesium] 数字孪生实践 | 超图插件打通UE4/Unity三维GIS管线全解析
1. 数字孪生与三维GIS技术融合的现状 数字孪生技术正在改变我们理解和构建物理世界的方式。简单来说,数字孪生就是通过数字化手段,在虚拟空间中创建一个与真实世界完全对应的"双胞胎"。这个数字化的双胞胎可以实时反映真实世界的状态ÿ…...
10个UTF8-CPP最佳实践:让你的C++ Unicode处理更高效
10个UTF8-CPP最佳实践:让你的C Unicode处理更高效 【免费下载链接】utfcpp UTF-8 with C in a Portable Way 项目地址: https://gitcode.com/gh_mirrors/ut/utfcpp UTF8-CPP是一个轻量级的C库,提供了便捷的UTF-8编码和解码功能,帮助开…...
GitHub个人访问令牌实战:告别密码认证,安全推送代码与创建PR
1. 项目概述与核心痛点如果你刚开始接触开源贡献,或者最近在尝试向GitHub推送代码时,大概率会遇到一个令人困惑的拦路虎:在终端执行git push命令后,系统提示你输入用户名和密码。你很自然地输入了登录GitHub网站用的账号密码&…...
API v2.0 设计规范
API v2.0 设计规范 【免费下载链接】marp-cli A CLI interface for Marp and Marpit based converters 项目地址: https://gitcode.com/gh_mirrors/ma/marp-cli 认证机制 // JWT 认证示例 const token jwt.sign({ userId: user.id },process.env.JWT_SECRET,{ expires…...
VSCode插件开发利器:cursor_info库实现光标上下文精准解析
1. 项目概述与核心价值最近在开发一个基于VSCode的插件时,遇到了一个挺有意思的需求:我需要实时获取并处理光标在编辑器中的精确位置信息,包括行列号、所在单词、甚至当前行的缩进级别。一开始,我尝试自己写逻辑去解析文档和计算位…...
粒子物理实验中的异构计算与AI技术应用
1. 粒子物理实验的计算挑战与机遇 粒子物理实验正经历前所未有的数据爆炸时代。以大型强子对撞机(HL-LHC)为例,其升级后的数据采集率将达到每秒数PB级别,这相当于每天产生约1亿张高清照片的数据量。传统基于CPU的串行计算架构已无…...
从零到一:Ubuntu Server上构建生产级Slurm计算集群
1. 环境准备与系统配置 在开始构建Slurm集群之前,我们需要确保所有节点都处于干净、一致的初始状态。我建议使用Ubuntu Server 22.04 LTS版本,这个长期支持版本经过充分测试,稳定性有保障。实际部署中发现,不同Linux发行版间的软件…...
