鉴权与安全规范
此规则定义了项目的认证授权机制,包括 JWT/Basic Auth 认证、用户上下文获取、权限校验模式等。它确保安全相关的代码实现保持一致性和正确性。
适用范围:
src/main/java/com/example/order/controller/**/*.javasrc/main/java/com/example/order/service/**/*.java
auth-security.mdc
---
description: 鉴权与安全规范,获取当前用户信息
globs:
- src/main/java/com/example/order/controller/**/*.java
- src/main/java/com/example/order/service/**/*.java
alwaysApply: false
---
# 鉴权与安全规范
## 鉴权方案
项目采用 `AuthFilter` 进行统一鉴权,支持两种认证方式:
1. **Bearer Token (JWT)** - 生产环境使用
2. **Basic Auth** - 测试和内部服务调用使用
所有请求必须携带 `Authorization` Header,未认证请求直接返回 401。
## 获取当前用户
通过 `SessionUserContext` 获取当前登录用户信息:
```java
import com.example.order.context.SessionUser;
import com.example.order.context.SessionUserContext;
// 在 Controller 或 Service 中
SessionUser sessionUser = SessionUserContext.getSessionUser();
Long userId = sessionUser.getId();
String email = sessionUser.getEmail();
String username = sessionUser.getUsername();
String name = sessionUser.getName();
```
### SessionUser 结构
```java
public class SessionUser {
private Long id; // 用户 ID
private String name; // 用户名称
private String email; // 用户邮箱
private String username; // 用户名
}
```
## 权限校验模式
### 1. Service 层独立 Checker 类
对于复杂的权限校验逻辑,使用独立的 Checker 类:
```java
@Service
public class OrderPermissionChecker {
public void check(Long orderId) throws ForbiddenException {
// 检查当前用户是否有权限访问该订单
SessionUser user = SessionUserContext.getSessionUser();
// ... 权限校验逻辑
if (!hasPermission) {
throw new ForbiddenException("...");
}
}
}
```
Controller 调用:
```java
@Resource
private OrderPermissionChecker orderPermissionChecker;
@PostMapping
public ResponseEntity saveOrderItem(@RequestBody OrderItemDto dto,
@RequestParam Long orderId) throws Exception {
orderPermissionChecker.check(orderId); // 权限校验
// ... 业务逻辑
}
```
### 2. Service 方法内部校验
简单场景可在 Service 方法内直接校验:
```java
public List<OrderDetailDto> getOrderDetails(
SessionUser sessionUser, Long customerId, ...) throws ForbiddenException {
if (!isCustomerOwner(sessionUser, customerId)) {
throw new ForbiddenException("user does not have the permission");
}
// ... 业务逻辑
}
```
## 已封装的工具(不要修改)
以下组件已经封装好,直接使用即可:
| 组件 | 路径 | 用途 |
| -------------------- | --------------------------------- | -------------- |
| `AuthFilter` | `auth/AuthFilter.java` | 认证过滤器 |
| `JwtAuthManager` | `auth/JwtAuthManager.java` | JWT 验证 |
| `BasicAuthManager` | `auth/BasicAuthManager.java` | Basic Auth验证 |
| `SessionUserContext` | `context/SessionUserContext.java` | 用户上下文 |
| `SessionUser` | `context/SessionUser.java` | 用户信息 |
## 测试中的认证
集成测试使用 Basic Auth 模拟用户:
```java
import com.example.order.integration.util.AuthUtil;
mockMvc.perform(
post("/api/order/create")
.headers(AuthUtil.buildHeadersForUserId("10001")) // 模拟用户 ID 为 10001 的用户
.contentType(MediaType.APPLICATION_JSON)
.content(payload)
);
```最后更新于: