from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel # 导入UserContextProvider和Authorize装饰器 from core.current_user import CurrentUserProvider from core.current_user.current_user import CurrentUser from core.decorators.auth_decorators import Authorize # 创建路由器 router = APIRouter(prefix="/api/example", tags=["示例接口"]) # 定义响应模型 class ResponseModel(BaseModel): code: int = 200 msg: str = "操作成功" data: Optional[dict] = None # 示例1:使用依赖注入获取当前用户,并配合Authorize装饰器 @router.get("/user-info") @Authorize(permissions="system:user:query") # 权限检查装饰器 async def get_user_info( current_user: CurrentUser = Depends( CurrentUserProvider.get_current_user_dependency() ), ): """获取当前用户信息""" # 由于使用了Authorize装饰器,current_user会被传递到装饰器中进行权限检查 # 然后再传递到这个函数中使用 if not current_user: raise HTTPException(status_code=401, detail="用户未登录") # 返回用户信息 return ResponseModel( data={ "user_id": current_user.user_id, "username": current_user.username, "nick_name": current_user.nick_name, "roles": current_user.roles, "permissions": current_user.permissions, } ) # 示例2:使用多个权限检查 @router.post("/admin-operation") @Authorize( permissions=["system:admin:edit", "system:admin:add"], is_all=True ) # 需要同时具备多个权限 async def admin_operation( current_user: CurrentUser = Depends( CurrentUserProvider.get_current_user_dependency() ), ): """需要多个权限的管理员操作""" # 由于使用了Authorize装饰器并设置了is_all=True,用户必须同时具备所有指定的权限 return ResponseModel(msg="管理员操作成功") # 示例3:使用角色检查 @router.delete("/delete-resource/{resource_id}") @Authorize(roles="admin") # 角色检查装饰器 async def delete_resource( resource_id: int, current_user: CurrentUser = Depends( CurrentUserProvider.get_current_user_dependency() ), ): """删除资源(需要admin角色)""" # 由于使用了Authorize装饰器并指定了roles,用户必须具备指定的角色 # 执行删除资源的操作... return ResponseModel(msg=f"资源 {resource_id} 已删除") # 示例4:同时检查角色和权限 @router.put("/update-system-config") @Authorize( roles=["admin", "system_manager"], # 需要这些角色之一 permissions="system:config:edit", # 同时需要此权限 ) async def update_system_config( current_user: CurrentUser = Depends( CurrentUserProvider.get_current_user_dependency() ), ): """更新系统配置(需要特定角色和权限)""" # 由于同时指定了roles和permissions,用户必须同时满足角色和权限要求 return ResponseModel(msg="系统配置已更新") # 如何在应用中注册这个路由器: """ 在main.py或app.py中: from fastapi import FastAPI from examples.route_example import router as example_router app = FastAPI() # 注册路由 app.include_router(example_router) """