Skip to Content

鉴权与安全规范

此规则定义了项目的认证授权机制,包括 JWT/Basic Auth 认证、用户上下文获取、权限校验模式等。它确保安全相关的代码实现保持一致性和正确性。

适用范围:

  • src/main/java/com/example/order/controller/**/*.java
  • src/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) ); ```
最后更新于: