Appearance
micro-java 安全与鉴权
micro-java 的认证授权逻辑集中在 xichen-common,由 auth-service 与 system-service 共同 @Import,与单体 server-java 的 common.security 包语义对齐。
请求链路
text
HTTP Request(经 Gateway 转发)
→ JwtAuthenticationFilter(解析 Bearer access Token)
→ CustomUserDetailsService(加载 permissions → GrantedAuthority)
→ SecurityContext
→ @PreAuthorize("hasAuthority('...')")Gateway 不参与 JWT 校验,Token 在下游服务验证。
SecurityConfig 白名单
无需登录:
| 路径 | 说明 |
|---|---|
/api/v1/health | 健康检查 |
/api/v1/auth/login | 登录 |
/api/v1/auth/refresh | 刷新 Token |
/api-docs/**、/swagger-ui/** | 各服务 Swagger |
其余路径:authenticated()。
Auth 接口(logout、me、change-password)仅需登录,无细粒度 permission。
权限码
System 模块与契约一致,例如:
| 端点 | 权限 |
|---|---|
| GET /system/users | system:user:list |
| POST /system/users | system:user:create |
| GET /system/permissions | system:role:list |
完整列表见 单体 Java 安全文档。
JWT 跨服务要求
auth-service 签发 Token,system-service 校验 Token。两边 JWT_SECRET 必须相同(默认读取 app.jwt.secret / 环境变量 JWT_SECRET)。
Token payload 含 userId,权限不落 Token,每次请求从 DB 加载。
401 / 403
| Handler | 场景 |
|---|---|
JsonAuthenticationEntryPoint | 未登录或 Token 无效 |
JsonAccessDeniedHandler | 已登录但 @PreAuthorize 不满足 |
响应格式与全仓统一:{ code, message, data }。
关键源码
| 类 | 路径 |
|---|---|
| SecurityConfig | xichen-common/.../config/SecurityConfig.java |
| JwtAuthenticationFilter | xichen-common/.../security/JwtAuthenticationFilter.java |
| JwtTokenProvider | xichen-common/.../security/JwtTokenProvider.java |
| AuthController | auth-service/.../controller/AuthController.java |
| System*Controller | system-service/.../controller/ |