增加 JWT 中间件以强化访问控制
为了进一步保护敏感的数据并限制特定端点的访问权限,蝙蝠侠在 Robyn 应用中添加了 JWT 验证中间件。通过中间件,系统可以验证请求的合法性并基于用户角色控制访问。
1. 设置认证中间件
Robyn 提供了一个灵活的 认证处理器 (AuthenticationHandler),可以用于自定义身份验证逻辑。
中间件代码
from robyn.authentication import AuthenticationHandler, BearerGetter, Identity
from robyn import Request
from sqlalchemy.orm import Session
from . import crud
class BasicAuthHandler(AuthenticationHandler):
def authenticate(self, request: Request):
# 从请求中提取 Bearer Token
token = self.token_getter.get_token(request)
try:
# 验证并解码 JWT
payload = crud.decode_access_token(token)
username = payload["sub"] # 从令牌中提取用户名
except Exception:
# 如果验证失败,则返回 None
return None
# 验证用户是否存在
with SessionLocal() as db:
user = crud.get_user_by_username(db, username=username)
# 如果用户存在,返回身份信息
if user:
return Identity(claims={"user": f"{user.username}"})
return None
# 配置应用程序以使用自定义认证中间件
app.configure_authentication(BasicAuthHandler(token_getter=BearerGetter()))
2. 示例端点:获取当前用户信息
在配置了中间件后,添加一个示例端点,用于返回当前登录用户的信息。
获取当前用户的端点
@app.get("/users/me", auth_required=True)
async def get_current_user(request):
# 使用 request.identity 提取身份信息
user = request.identity.claims["user"]
return {"current_user": user}
auth_required=True
:确保此端点只有经过认证的用户才能访问。request.identity
:包含用户的身份信息(例如用户名、角色等)。
3. 增强访问控制:基于角色的访问限制
进一步扩展应用逻辑,通过角色限制访问。例如,仅管理员可以删除犯罪记录。
基于角色的访问限制
@app.delete("/crimes/{crime_id}", auth_required=True)
async def delete_crime(request):
# 提取用户身份
user = request.identity.claims["user"]
# 示例:检查用户是否为管理员
if user != "admin":
return {"error": "Permission denied", "status_code": 403}
crime_id = int(request.path_params.get("crime_id"))
with SessionLocal() as db:
success = crud.delete_crime(db, crime_id=crime_id)
if not success:
return {"error": "Crime not found", "status_code": 404}
return {"message": "Crime deleted successfully"}
通过添加认证中间件和基于角色的访问限制,蝙蝠侠不仅保证了系统的安全性,还使系统能够灵活应对复杂的权限需求。现在,哥谭市警察局可以放心地管理犯罪数据,并专注于打击犯罪。