route_example.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from typing import Optional
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from pydantic import BaseModel
  4. # 导入UserContextProvider和Authorize装饰器
  5. from core.current_user import CurrentUserProvider
  6. from core.current_user.current_user import CurrentUser
  7. from core.decorators.auth_decorators import Authorize
  8. # 创建路由器
  9. router = APIRouter(prefix="/api/example", tags=["示例接口"])
  10. # 定义响应模型
  11. class ResponseModel(BaseModel):
  12. code: int = 200
  13. msg: str = "操作成功"
  14. data: Optional[dict] = None
  15. # 示例1:使用依赖注入获取当前用户,并配合Authorize装饰器
  16. @router.get("/user-info")
  17. @Authorize(permissions="system:user:query") # 权限检查装饰器
  18. async def get_user_info(
  19. current_user: CurrentUser = Depends(
  20. CurrentUserProvider.get_current_user_dependency()
  21. ),
  22. ):
  23. """获取当前用户信息"""
  24. # 由于使用了Authorize装饰器,current_user会被传递到装饰器中进行权限检查
  25. # 然后再传递到这个函数中使用
  26. if not current_user:
  27. raise HTTPException(status_code=401, detail="用户未登录")
  28. # 返回用户信息
  29. return ResponseModel(
  30. data={
  31. "user_id": current_user.user_id,
  32. "username": current_user.username,
  33. "nick_name": current_user.nick_name,
  34. "roles": current_user.roles,
  35. "permissions": current_user.permissions,
  36. }
  37. )
  38. # 示例2:使用多个权限检查
  39. @router.post("/admin-operation")
  40. @Authorize(
  41. permissions=["system:admin:edit", "system:admin:add"], is_all=True
  42. ) # 需要同时具备多个权限
  43. async def admin_operation(
  44. current_user: CurrentUser = Depends(
  45. CurrentUserProvider.get_current_user_dependency()
  46. ),
  47. ):
  48. """需要多个权限的管理员操作"""
  49. # 由于使用了Authorize装饰器并设置了is_all=True,用户必须同时具备所有指定的权限
  50. return ResponseModel(msg="管理员操作成功")
  51. # 示例3:使用角色检查
  52. @router.delete("/delete-resource/{resource_id}")
  53. @Authorize(roles="admin") # 角色检查装饰器
  54. async def delete_resource(
  55. resource_id: int,
  56. current_user: CurrentUser = Depends(
  57. CurrentUserProvider.get_current_user_dependency()
  58. ),
  59. ):
  60. """删除资源(需要admin角色)"""
  61. # 由于使用了Authorize装饰器并指定了roles,用户必须具备指定的角色
  62. # 执行删除资源的操作...
  63. return ResponseModel(msg=f"资源 {resource_id} 已删除")
  64. # 示例4:同时检查角色和权限
  65. @router.put("/update-system-config")
  66. @Authorize(
  67. roles=["admin", "system_manager"], # 需要这些角色之一
  68. permissions="system:config:edit", # 同时需要此权限
  69. )
  70. async def update_system_config(
  71. current_user: CurrentUser = Depends(
  72. CurrentUserProvider.get_current_user_dependency()
  73. ),
  74. ):
  75. """更新系统配置(需要特定角色和权限)"""
  76. # 由于同时指定了roles和permissions,用户必须同时满足角色和权限要求
  77. return ResponseModel(msg="系统配置已更新")
  78. # 如何在应用中注册这个路由器:
  79. """
  80. 在main.py或app.py中:
  81. from fastapi import FastAPI
  82. from examples.route_example import router as example_router
  83. app = FastAPI()
  84. # 注册路由
  85. app.include_router(example_router)
  86. """