| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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)
- """
|