feature/optimizacion-de-permisos

This commit is contained in:
2026-05-29 09:48:43 -06:00
parent 84d5f092d8
commit e2445d454b
25 changed files with 1003 additions and 170 deletions

View File

@@ -20,7 +20,6 @@ from core.s3_keys import company_certificate_key, company_logo_key
from core.storage_s3 import delete_object_if_exists, get_object_bytes, put_object_bytes
from core.security import (
collect_company_ids_from_app_membership,
collect_user_role_names,
get_current_user,
get_tenant_from_token,
is_hub_admin,
@@ -42,7 +41,13 @@ logger = logging.getLogger(__name__)
def _user_is_admin(current_user: dict) -> bool:
return "admin" in collect_user_role_names(current_user) or is_hub_admin(current_user)
"""
Bypass cross-tenant para endpoints sin company_id en la firma. La única
fuente válida es hub_admin atestado por el Hub; el antiguo bypass por rol
"admin" del realm Keycloak se eliminó para no depender de claims del JWT.
Los super_admin locales operan a nivel de compañía (validate_access_to_resource).
"""
return is_hub_admin(current_user)
def _assert_permission_any_company(
@@ -213,12 +218,10 @@ async def get_my_companies(
(``user_company_roles``, ``user_company_permissions``, ``user_tenants``).
Hub admin: si hay X-Tenant-Override muestra solo ese tenant; si no, muestra todos.
"""
from core.security import collect_user_role_names
user_roles = collect_user_role_names(current_user)
# Hub admin: respeta X-Tenant-Override para filtrar por tenant seleccionado;
# sin override devuelve todo (visibilidad global).
if "hub_admin" in user_roles:
# sin override devuelve todo (visibilidad global). Se consulta el booleano
# normalizado por el Hub (no se lee del JWT) para no acoplar a claims.
if is_hub_admin(current_user):
service = CompanyService(db)
override = request.headers.get("X-Tenant-Override")
query = db.query(Company).filter(Company.deleted_at.is_(None))