30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from fastapi import Header, Request
|
|
|
|
from app.core.context import UserContext
|
|
from app.core.exceptions import AppError
|
|
|
|
|
|
async def get_user_context(
|
|
request: Request,
|
|
x_user_id: str | None = Header(default=None, alias="X-User-Id"),
|
|
x_tenant_id: str | None = Header(default=None, alias="X-Tenant-Id"),
|
|
x_user_role: str | None = Header(default=None, alias="X-User-Role"),
|
|
x_class_id: str | None = Header(default=None, alias="X-Class-Id"),
|
|
x_entry_scene: str | None = Header(default=None, alias="X-Entry-Scene"),
|
|
x_request_id: str | None = Header(default=None, alias="X-Request-Id"),
|
|
) -> UserContext:
|
|
"""用户校验:读取请求头并强制校验 `X-User-Id`。"""
|
|
if not x_user_id or not x_user_id.strip():
|
|
raise AppError("USER_ID_REQUIRED", "X-User-Id header is required", 401)
|
|
|
|
return UserContext(
|
|
user_id=x_user_id.strip(),
|
|
tenant_id=x_tenant_id,
|
|
role=x_user_role,
|
|
class_id=x_class_id,
|
|
entry_scene=x_entry_scene,
|
|
request_id=x_request_id,
|
|
ip_address=request.client.host if request.client else None,
|
|
user_agent=request.headers.get("User-Agent"),
|
|
)
|