1.基础用法
1 | from fastapi import FastAPI, Security |
- 使用
OAuth2PasswordBearer声明OAuth2安全方案,通过scopes参数定义权限范围 - 通过
Security替代Depends声明路径操作依赖项,添加scopes参数指定所需权限 - 请求处理流程:
graph TD A[客户端请求] --> B{Token是否有效?} B -->|无效| C[返回401错误] B -->|有效| D{Scope是否匹配?} D -->|不匹配| E[返回403权限不足] D -->|匹配| F[执行业务逻辑]
2.Scopes校验机制
2.1 Token生成
1 | # 登录时生成包含scopes的token |
- 在JWT token的payload中加入
scopes字段存储权限列表 - 可通过用户实际权限或前端请求动态赋值scopes
2.2 权限校验
1 | async def get_current_user(security_scopes: SecurityScopes, token: str = Depends(oauth2_scheme)): |
- 通过
SecurityScopes对象获取当前路径操作所需的所有scopes scopes属性包含所有依赖项链声明的权限集合
3.依赖项层次结构
1 | async def get_current_active_user( |
- 依赖项树中的scopes会合并传递,例如:
/users/me/items/最终校验["me", "items"]两个scopes/users/me/仅校验["me"]
- 每个Security依赖项可声明自己的scopes需求
4.生产环境建议
Scope命名规范:
- 使用
service:action格式(如users:read) - Google风格URL命名(如
https://api.example.com/auth/drive)
- 使用
安全增强:
- 登录时过滤无效scopes请求,只返回用户真实拥有的权限
- 结合HTTPS传输敏感scope信息
文档集成:
- 在Swagger UI中展示可选的scopes列表
- 通过
responses参数补充错误状态码说明
测试命令示例:
1
2 # 获取带scope的token
curl -X POST "http://localhost:8000/token" -d "username=foo&password=secret&scopes=me items"