fix(logging): action troncata a 100, ip_address dal client IP proxy-aware (#36 punto 6)

action era action=f"{method} {path}" senza limite: un path lungo falliva
l'INSERT (String(100)), inghiottito dal try/except generico, e la riga di
audit spariva in silenzio. Troncata a 100 caratteri. ip_address usava
request.client.host, che dietro Nginx/Flask e' sempre il proxy: ora usa
RateLimitMiddleware._client_ip(request), lo stesso risolutore proxy-aware
del rate limiter (X-Forwarded-For con trusted_proxy_count).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 22:42:16 +02:00
parent a2f357b3d3
commit 5ca3dc14cd
2 changed files with 126 additions and 2 deletions
+8 -2
View File
@@ -6,9 +6,14 @@ from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
from sqlalchemy import insert
from src.backend.api.middleware.rate_limit import RateLimitMiddleware
from src.backend.database import async_session_factory
from src.backend.models.orm.access_log import AccessLog
# AccessLog.action is String(100): a long path (with query-string-like
# segments) silently failed the insert before this truncation existed.
_ACTION_MAX_LENGTH = 100
class AccessLogMiddleware(BaseHTTPMiddleware):
"""Middleware that logs every API request to the access_logs table."""
@@ -30,11 +35,12 @@ class AccessLogMiddleware(BaseHTTPMiddleware):
# Log asynchronously (don't block response)
try:
action = f"{request.method} {request.url.path}"[:_ACTION_MAX_LENGTH]
async with async_session_factory() as session:
await session.execute(
insert(AccessLog).values(
user_id=user_id,
action=f"{request.method} {request.url.path}",
action=action,
details={
"method": request.method,
"path": request.url.path,
@@ -42,7 +48,7 @@ class AccessLogMiddleware(BaseHTTPMiddleware):
"status_code": response.status_code,
"duration_ms": round(duration_ms, 2),
},
ip_address=request.client.host if request.client else None,
ip_address=RateLimitMiddleware._client_ip(request),
user_agent=request.headers.get("user-agent", "")[:500],
)
)