探索微服务中的权限控制:一次线上问题排查的思考

embedded/2024/11/13 23:00:30/

在这篇博客中,我将分享一个近期在排查线上问题时,意外发现的权限控制实现方式。起初,这个问题让我迷惑不已,因为在前端请求中,有个权限控制参数为 null,但在请求从网关进入微服务后,该参数神秘地有了值。经过一番深入探究,我找到了答案:原来这背后是一段优雅的切点代码。

问题背景

最近在排查一个线上问题时,前端调用的请求体中,有个权限控制的参数为null, 但是请求从网关进入微服务中之后,这个参数却莫名其妙地有了值。

起初,我反复检查了代码,试图找出这个参数何时被赋值,但始终未果。直觉告诉我,这可能与切点相关。切点可以在方法执行前后动态地插入代码片段,于是我决定证实这个猜想。

验证过程

带着这个猜想,我在项目中全局搜索了 @Pointcut 和 @Before 注解。果然,发现了一段与权限控制相关的切面代码。在这段代码中,看到了对于权限参数的赋值逻辑,这就解释了参数为何在进入微服务后有值。

思路解析

下面,我将对这段权限控制的实现进行详细解析,并展示如何通过切面编程来动态赋值权限参数。

首先,我们需要定义一个权限控制的切面类,以便能够在特定方法执行前后进行逻辑处理。

@Aspect
@Component
public class AccessControlAspect{……
}
  • @Aspect:声明一个切面类。
  • @Component:将该切面类纳入 Spring 容器管理。

接下来,使用 @Pointcut 注解定义一个切入点,匹配所有被 @EmployeeAccessControl 注解的方法。

@Pointcut("@annotation(EmployeeAccessControl)")
public void AccessControl(){}
  • @Pointcut:定义一个命名的切入点,便于在通知中引用。
  • @annotation(EmployeeAccessControl):表示匹配所有带有 @EmployeeAccessControl 注解的方法。

然后,创建自定义注解EmployeeAccessControl,用来标记需要使用权限控制的方法。

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EmployeeAccessControl {String description()  default "";
}

在方法执行前,我们通过 @Before 注解实现权限参数赋值的逻辑。

@Before("AccessControl()")
public void doBefore(JoinPoint joinPoint) {// 这里使用了动态代理,后续有时间了出篇博客详细来讲Object[] args = joinPoint.getArgs();PageParam pageParam = null;for (Object arg : args) {if (arg instanceof PageParam) {pageParam = (PageParam) arg;}}// 实体转化的逻辑忽略// 权限控制的参数赋值逻辑也忽略,自行补充。
}

最后,为了使切面生效,只需要在需要权限控制的方法前加上 @EmployeeAccessControl 注解即可。

@EmployeeAccessControl(description = "获取员工列表")
public List<Employee> getEmployeeList(PageParam pageParam) {// 方法逻辑,pageParam 中的权限参数已被赋值
}

切点(PointCut)和切面(Aspect)

最后,我们来一起回顾下切点和切面的这两个知识点。

在 Java 中,切点和切面是 AOP(面向切面编程)的两个关键概念。切点(Pointcut)定义了 “何时” 和 “何处” 触发切面(Aspect),而切面则包含了切点的具体逻辑实现,比如登录、事务管理等。简单来说,切面是启用横切关注点的具体实现,而切点是定义在哪些切入点进行横切的规范。


http://www.ppmy.cn/embedded/137341.html

相关文章

aws(学习笔记第十二课) 使用AWS的RDS-MySQL

aws(学习笔记第十二课) 使用AWS的RDS 学习内容&#xff1a; AWS的RDS-MySQL 1. 使用AWS的RDS 什么是RDS RDS就是Relation Database Service的缩写&#xff0c;是AWS提供的托管关系型数据库系统。让用户能够在 AWS Cloud 云中更轻松地设置、操作和扩展关系数据库。 数据库和we…

软件设计课程笔记

11.11就做了这两件事情 写在前面11.11课程总结&#xff08;1&#xff09;将开发板与pc机连接到同一个局域网&#xff08;2&#xff09;NFS共享文件设置 写在前面 “好记性不如烂笔头”。记性太差&#xff0c;总结来救。水平太差&#xff0c;那没办法。这是写给自己的课程笔记&…

RoseTTAFold MSA_emb类解读

MSA_emb 类的作用是对多序列对齐(MSA)数据进行嵌入编码,同时添加位置编码和查询编码(调用PositionalEncoding 和 QueryEncoding)以便为序列特征建模类。 源代码: class MSA_emb(nn.Module):def __init__(self, d_model=64, d_msa=21, p_drop=0.1, max_len=5000):super(…

Spring Boot编程训练系统:技术实现与案例分析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

解决表格出现滚动条样式错乱问题

自定义表格出现滚动条时&#xff0c;会因为宽度不对等导致样式错乱&#xff1b; 解决思路&#xff1a; 监听表格数据的变化&#xff0c;当表格出现滚动条时&#xff0c;再调用更新宽度的方法updateWidth&#xff0c;去改变表格头部的宽度&#xff0c;最终保持表格头部和内容对…

方法论-2W1H提问法

概述 2W1H&#xff08;What, Why, How&#xff09;提问法是一种简洁而高效的分析工具&#xff0c;通过明确回答三个核心问题&#xff1a;“What&#xff08;是什么&#xff09;”、“Why&#xff08;为什么&#xff09;”和“How&#xff08;如何做&#xff09;”&#xff0c;…

C++写一个Date日期类

一个日期类作为类和对象知识点的总结 注意&#xff1a; 因为历史上1582年10月是少了10天&#xff0c;并且闰年的计算规则在1582年前后是不同的&#xff0c;因此计算某一天是周几&#xff0c;直接采用了倒推的方式确定公元1年1月1日是周几&#xff0c;然后反过来写的。&#xff…

Python操作系统交互:subprocess库的基本应用

Python 操作系统交互&#xff1a;subprocess 库的基本应用 在日常的 Python 编程中&#xff0c;操作系统交互是一个常见的需求。无论是调用外部命令、与操作系统进程进行交互&#xff0c;还是在 Python 中运行脚本&#xff0c;subprocess 庋是一个强大的工具。它为 Python 提供…