Appearance
Python 权限依赖
实现:app/api/deps.py、app/core/permissions.py
等价于 Java 的 JwtAuthenticationFilter + @PreAuthorize("hasAuthority('...')")。
依赖链
text
HTTP Authorization: Bearer <accessToken>
→ get_current_user_id(JWT 校验,须 type=access)
→ get_current_user(用户存在且 status=1)
→ require_permission("system:user:list")(细粒度 RBAC)require_permission
python
def require_permission(permission: str):
def dependency(user: SysUser = Depends(get_current_user)) -> SysUser:
if permission not in collect_permission_codes(user):
raise HTTPException(status_code=403, detail="没有访问权限")
return user
return dependency路由用法:
python
@router.get("/users")
def list_users(_: SysUser = Depends(require_permission("system:user:list")), ...):公开接口(无需 Token)
与 Java Security 白名单 对齐:
| 路径 | 说明 |
|---|---|
GET /api/v1/health | 健康检查 |
POST /api/v1/auth/login | 登录 |
POST /api/v1/auth/refresh | 刷新 |
POST /api/v1/system/database/init | 数据库 init(另受 DB_INIT_ALLOW_WEB) |
GET /api/v1/system/files/download/** | 文件下载 |
其余接口均需有效 access Token。
Auth 接口(仅需登录)
无 require_permission,仅 Depends(get_current_user):
POST /auth/logoutGET /auth/meGET/PUT /auth/profilePOST /auth/change-password
权限来源
用户 → sys_user_role → 角色 → sys_role_permission → permission.code
不使用角色 code 作为 authority。
菜单过滤
AuthService._build_menu_tree() 与 Java filterMenu 规则相同;core/menu_client.py 处理多端 client 字段。
401 / 403 文案
| 场景 | message |
|---|---|
| 未登录 / Token 无效 | 未登录或登录已失效 |
| 无权限 | 没有访问权限 |
| 用户禁用 | 用户已禁用 |