Appearance
Java 安全与鉴权
请求链路
text
HTTP Request
→ JwtAuthenticationFilter(解析 Bearer access Token)
→ CustomUserDetailsService(按 userId 加载 permissions → GrantedAuthority)
→ SecurityContext
→ @PreAuthorize("hasAuthority('...')")Token payload 含 userId,不存 permissions;每次请求从 DB 重新加载权限码。
SecurityConfig 白名单
无需登录(permitAll):
| 路径 | 说明 |
|---|---|
GET /api/v1/health | 健康检查 |
POST /api/v1/auth/login | 登录 |
POST /api/v1/auth/refresh | 刷新 Token |
POST /api/v1/system/database/init | 数据库初始化(生产应关闭开关) |
GET /api/v1/system/files/download/** | 文件下载(匿名访问) |
/api-docs/**、/swagger-ui/**、/swagger-ui.html | OpenAPI 文档 |
GET /actuator/health | Actuator 健康 |
OPTIONS /** | CORS 预检 |
其余接口:authenticated()。/actuator/**(除 health 外)需登录。
实现:common/config/SecurityConfig.java
@PreAuthorize 权限码
System 与 Monitor 模块在 Controller 方法上使用 @PreAuthorize("hasAuthority('...')")。
System 示例
| 端点 | 权限 |
|---|---|
GET /api/v1/system/users | system:user:list |
POST /api/v1/system/users | system:user:create |
GET /api/v1/system/users/export | system:user:export |
POST /api/v1/system/users/import | system:user:import |
GET /api/v1/system/roles | system:role:list |
PUT /api/v1/system/roles/{id}/permissions | system:role:update |
GET /api/v1/system/permissions | system:permission:list |
GET /api/v1/system/menus | system:menu:list |
GET /api/v1/system/depts | system:dept:list |
GET /api/v1/system/dict/types | system:dict:list |
GET /api/v1/system/configs | system:config:list |
POST /api/v1/system/files/upload | system:file:upload |
完整端点列表见 System 平台管理。
Monitor 示例
| 端点 | 权限 |
|---|---|
GET /api/v1/monitor/operlogs | monitor:operlog:list |
DELETE /api/v1/monitor/operlogs/{id} | monitor:operlog:delete |
GET /api/v1/monitor/logininfor | monitor:logininfor:list |
GET /api/v1/monitor/jobs | monitor:job:list |
POST /api/v1/monitor/jobs/{id}/run | monitor:job:update |
详见 Monitor 监控。
Auth 接口
以下仅需 登录,无细粒度 system:* / monitor:* 权限:
POST /api/v1/auth/logoutGET /api/v1/auth/meGET/PUT /api/v1/auth/profilePOST /api/v1/auth/change-password
401 / 403
| Handler | message |
|---|---|
JsonAuthenticationEntryPoint | 未登录或登录已失效 |
JsonAccessDeniedHandler | 没有访问权限 |
JWT 说明
- access / refresh 两种 type,API 请求只用 access
- access 默认 1 小时,refresh 默认 7 天(见
application.yml) - 前端 api-client 在 401 时用 refresh 换新 access
数据权限
DataScopeService 按角色 data_scope 过滤用户列表等数据:
| 值 | 含义 |
|---|---|
| 1 | 全部数据 |
| 2 | 自定义(角色绑定部门) |
| 3 | 本部门 |
| 4 | 本部门及以下 |
| 5 | 仅本人 |
关键类
| 类 | 路径 |
|---|---|
| SecurityConfig | common/config/SecurityConfig.java |
| JwtAuthenticationFilter | common/security/JwtAuthenticationFilter.java |
| CustomUserDetailsService | auth/service/CustomUserDetailsService.java |
| DataScopeService | system/service/DataScopeService.java |