fix(middlewares): 添加JSON字段规范化处理确保数据合法性

refactor(api): 统一路由依赖认证,调整部分路由权限配置

在middlewares.py中添加normalize_json_field方法处理JSON字段,确保写入数据库的数据合法
在__init__.py中统一路由认证依赖,部分路由从仅需权限改为同时需要认证和权限
This commit is contained in:
邹方成 2025-10-09 14:44:17 +08:00
parent 982da3f076
commit 258404fa45
3 changed files with 55 additions and 18 deletions

View File

@ -1,6 +1,7 @@
from fastapi import APIRouter
from fastapi import APIRouter, Depends
from app.core.dependency import DependPermission
from app.core.dependency import DependAuth, DependPermission
from app.utils.app_user_jwt import get_current_app_user
from .apis import apis_router
from .app_users import app_users_router
@ -23,15 +24,19 @@ v1_router = APIRouter()
v1_router.include_router(base_router, prefix="/base")
v1_router.include_router(app_users_router, prefix="/app-user") # AppUser路由无需权限依赖
v1_router.include_router(app_valuations_router, prefix="/app-valuations") # 用户端估值评估路由,需要认证
v1_router.include_router(users_router, prefix="/user", dependencies=[DependPermission])
v1_router.include_router(roles_router, prefix="/role", dependencies=[DependPermission])
v1_router.include_router(menus_router, prefix="/menu", dependencies=[DependPermission])
v1_router.include_router(apis_router, prefix="/api", dependencies=[DependPermission])
v1_router.include_router(depts_router, prefix="/dept", dependencies=[DependPermission])
v1_router.include_router(auditlog_router, prefix="/auditlog", dependencies=[DependPermission])
v1_router.include_router(esg_router, prefix="/esg", dependencies=[DependPermission])
v1_router.include_router(index_router, prefix="/index", dependencies=[DependPermission])
v1_router.include_router(industry_router, prefix="/industry", dependencies=[DependPermission])
v1_router.include_router(policy_router, prefix="/policy", dependencies=[DependPermission])
v1_router.include_router(third_party_api_router, prefix="/third_party_api", dependencies=[DependPermission])
v1_router.include_router(valuations_router, prefix="/valuations", dependencies=[DependPermission])
v1_router.include_router(users_router, prefix="/user", dependencies=[DependAuth, DependPermission])
v1_router.include_router(roles_router, prefix="/role", dependencies=[DependAuth, DependPermission])
v1_router.include_router(menus_router, prefix="/menu", dependencies=[DependAuth, DependPermission])
v1_router.include_router(apis_router, prefix="/api", dependencies=[DependAuth, DependPermission])
v1_router.include_router(depts_router, prefix="/dept", dependencies=[DependAuth, DependPermission])
v1_router.include_router(auditlog_router, prefix="/auditlog", dependencies=[DependAuth, DependPermission])
v1_router.include_router(esg_router, prefix="/esg")
v1_router.include_router(index_router, prefix="/index")
v1_router.include_router(industry_router, prefix="/industry")
v1_router.include_router(policy_router, prefix="/policy")
v1_router.include_router(
third_party_api_router,
prefix="/third_party_api",
dependencies=[DependAuth, DependPermission],
)
v1_router.include_router(valuations_router, prefix="/valuations", dependencies=[DependAuth, DependPermission])

View File

@ -122,6 +122,35 @@ class HttpAuditLogMiddleware(BaseHTTPMiddleware):
pass
return v
def normalize_json_field(self, value: Any) -> Any:
"""确保写入 JSONField 的值合法。"""
if value is None:
return None
if isinstance(value, (bytes, bytearray)):
try:
value = value.decode("utf-8")
except Exception:
value = value.decode("utf-8", errors="ignore")
if isinstance(value, str):
stripped = value.strip()
if not stripped:
return None
try:
return json.loads(stripped)
except (ValueError, TypeError):
return stripped
if isinstance(value, (dict, list, int, float, bool)):
return value
try:
json.dumps(value)
return value
except (TypeError, ValueError):
return str(value)
async def _async_iter(self, items: list[bytes]) -> AsyncGenerator[bytes, None]:
for item in items:
yield item
@ -166,8 +195,11 @@ class HttpAuditLogMiddleware(BaseHTTPMiddleware):
data: dict = await self.get_request_log(request=request, response=response)
data["response_time"] = process_time
data["request_args"] = request.state.request_args
data["response_body"] = await self.get_response_body(request, response)
request_args = getattr(request.state, "request_args", None)
response_body = await self.get_response_body(request, response)
data["request_args"] = self.normalize_json_field(request_args)
data["response_body"] = self.normalize_json_field(response_body)
await AuditLog.create(**data)
return response

View File

@ -37,5 +37,5 @@
export DOCKER_DEFAULT_PLATFORM=linux/amd64
docker build -t zfc931912343/guzhi-fastapi-admin:v1.0 .
docker push zfc931912343/guzhi-fastapi-admin:v1.0
docker build -t zfc931912343/guzhi-fastapi-admin:v1.1 .
docker push zfc931912343/guzhi-fastapi-admin:v1.1