Skip to content

Python 权限依赖

实现:app/api/deps.pyapp/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/logout
  • GET /auth/me
  • GET/PUT /auth/profile
  • POST /auth/change-password

权限来源

用户 → sys_user_role → 角色 → sys_role_permissionpermission.code
不使用角色 code 作为 authority。

菜单过滤

AuthService._build_menu_tree() 与 Java filterMenu 规则相同;core/menu_client.py 处理多端 client 字段。

401 / 403 文案

场景message
未登录 / Token 无效未登录或登录已失效
无权限没有访问权限
用户禁用用户已禁用

相关文档

Xichen Full Stack 内部文档