markdown复制## 1. 项目背景与问题定位
去年在一次常规安全审计中,我们的电商后台系统被发现存在严重的数据越权漏洞。攻击者只需修改请求参数中的公司ID,就能非法获取其他商户的销售数据。这种水平权限漏洞(Horizontal Privilege Escalation)在Web应用中极为常见,但危害性极高。
问题的本质在于:系统在Controller层只做了基础的登录认证,却没有对数据访问权限进行细粒度控制。随着业务发展,系统已有超过300个接口,手动为每个接口添加权限校验既不现实也难以维护。
## 2. 解决方案设计思路
### 2.1 核心需求拆解
理想的解决方案需要满足:
- **无侵入性**:不改动现有业务逻辑代码
- **声明式配置**:通过注解即可完成权限控制
- **灵活适配**:支持各种参数传递方式:
- 基础类型参数:`/api?companyId=123`
- 对象属性:`request.getCompanyId()`
- 集合元素:`List<User>.getCompanyId()`
- 嵌套属性:`request.getCompany().getId()`
### 2.2 技术选型对比
| 方案 | 优点 | 缺点 |
|---------------------|-----------------------|--------------------------|
| Filter拦截器 | 执行时机早 | 难以获取方法参数信息 |
| Interceptor拦截器 | 可获取HandlerMethod | 无法直接修改参数值 |
| AOP切面 | 完整方法上下文 | 需处理代理问题 |
| 自定义参数解析器 | 精准控制参数 | 只能处理特定参数类型 |
最终选择AOP方案,因其能:
1. 获取完整的方法签名和参数值
2. 支持灵活的条件判断
3. 与Spring生态无缝集成
## 3. 核心实现细节
### 3.1 注解定义与解析
定义`@DataPermission`注解包含以下关键属性:
```java
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataPermission {
/**
* 权限资源类型
*/
ResourceType resource() default ResourceType.COMPANY;
/**
* 参数提取策略
*/
ParamStrategy strategy() default ParamStrategy.DIRECT;
/**
* 目标参数名/路径
* 如"companyId"或"order.company.id"
*/
String target();
/**
* 参数索引位置
*/
int position() default 0;
}
通过AnnotationUtils工具类实现注解继承逻辑:
java复制// 获取方法上的注解(包括父类/接口上的注解)
Method method = ((MethodSignature) pjp.getSignature()).getMethod();
DataPermission ann = AnnotationUtils.fi
