Files
X-Financial/server/tests/auth_helpers.py

54 lines
2.4 KiB
Python
Raw Normal View History

2026-07-13 14:45:36 +08:00
from __future__ import annotations
from typing import Annotated
from fastapi import FastAPI, Header
from app.api.deps import CurrentUserContext, get_current_user
def install_legacy_header_auth_override(app: FastAPI) -> None:
"""让领域接口测试专注业务断言,不把旧请求头带回生产认证链路。"""
app.dependency_overrides[get_current_user] = _read_test_user_headers
def _read_test_user_headers(
username: Annotated[str | None, Header(alias="X-Auth-Username")] = None,
name: Annotated[str | None, Header(alias="X-Auth-Name")] = None,
role_codes: Annotated[str | None, Header(alias="X-Auth-Role-Codes")] = None,
is_admin: Annotated[str | None, Header(alias="X-Auth-Is-Admin")] = None,
department: Annotated[str | None, Header(alias="X-Auth-Department")] = None,
cost_center: Annotated[str | None, Header(alias="X-Auth-Cost-Center")] = None,
position: Annotated[str | None, Header(alias="X-Auth-Position")] = None,
grade: Annotated[str | None, Header(alias="X-Auth-Grade")] = None,
employee_no: Annotated[str | None, Header(alias="X-Auth-Employee-No")] = None,
manager_name: Annotated[str | None, Header(alias="X-Auth-Manager-Name")] = None,
) -> CurrentUserContext:
normalized_username = str(username or "").strip()
normalized_name = str(name or normalized_username).strip()
if not normalized_username and not normalized_name:
normalized_username = "test-admin"
normalized_name = "Test Admin"
is_admin = "true"
normalized_roles = [
normalized
for item in str(role_codes or "").split(",")
if (normalized := item.strip().lower())
]
admin_flag = str(is_admin or "").strip().lower() in {"1", "true", "yes", "on"}
admin_flag = admin_flag or normalized_username.lower() in {"admin", "superadmin"}
admin_flag = admin_flag or bool(set(normalized_roles) & {"admin", "superadmin"})
return CurrentUserContext(
username=normalized_username or normalized_name,
name=normalized_name or normalized_username,
role_codes=normalized_roles,
is_admin=admin_flag,
department_name=str(department or "").strip(),
cost_center=str(cost_center or "").strip(),
position=str(position or "").strip(),
grade=str(grade or "").strip(),
employee_no=str(employee_no or "").strip(),
manager_name=str(manager_name or "").strip(),
)