fix: solución de bloqueos y estandarización de permisos
This commit is contained in:
@@ -61,6 +61,7 @@ class UserInfoResponseDTO(BaseModel):
|
||||
tenant_id: Optional[int] = None
|
||||
tenant_slug: Optional[str] = None
|
||||
roles: list[str] = []
|
||||
permissions: list[str] = []
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
@@ -71,6 +72,7 @@ class UserInfoResponseDTO(BaseModel):
|
||||
"preferred_username": "jperez",
|
||||
"tenant_id": 1,
|
||||
"roles": ["user", "admin"],
|
||||
"permissions": ["cat_ports.view", "cat_ports.create"]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -253,6 +253,40 @@ class AuthService:
|
||||
if isinstance(tenant_slug, list):
|
||||
tenant_slug = tenant_slug[0] if tenant_slug else None
|
||||
|
||||
# Obtener permisos del usuario en todas las compañías permitidas
|
||||
permissions = set()
|
||||
user_sub = user_info.get("sub")
|
||||
if user_sub:
|
||||
from api.v1.modules.core.permissions.service import PermissionService
|
||||
from api.v1.modules.core.permissions.models import UserCompanyRole
|
||||
perm_service = PermissionService(self.db)
|
||||
|
||||
# Obtener todas las compañías a las que el usuario tiene acceso
|
||||
user_roles = self.db.query(UserCompanyRole.company_id).filter(
|
||||
UserCompanyRole.user_id == user_sub,
|
||||
UserCompanyRole.is_active == True
|
||||
).distinct().all()
|
||||
|
||||
# Unir los permisos de todas las compañías para alimentar la UI
|
||||
for (cid,) in user_roles:
|
||||
permissions.update(perm_service.get_user_permissions(user_sub, cid))
|
||||
|
||||
# 🛡️ MEJORA DEV: Si es admin de Keycloak O estamos en desarrollo y no tiene permisos locales aún.
|
||||
# Esto evita el "lockout" cuando se reinicia el proyecto para todos los usuarios.
|
||||
from core.config import settings
|
||||
if "admin" in roles or (settings.ENVIRONMENT == "development" and not permissions):
|
||||
try:
|
||||
from api.v1.modules.core.permissions.registry import registry as perm_registry
|
||||
# Asegurar que los permisos core estén registrados
|
||||
from api.v1.modules.core.permissions import seed_v2
|
||||
all_registered = [p.code for p in perm_registry.get_all()]
|
||||
permissions.update(all_registered)
|
||||
logger.info(f"God Mode (Dev): Otorgando {len(all_registered)} permisos al usuario {user_sub}")
|
||||
except Exception as e:
|
||||
logger.error(f"Error in God Mode bootstrap: {e}")
|
||||
|
||||
permissions = list(permissions)
|
||||
|
||||
return UserInfoResponseDTO(
|
||||
sub=user_info.get("sub"),
|
||||
email=user_info.get("email"),
|
||||
@@ -261,6 +295,7 @@ class AuthService:
|
||||
tenant_id=int(tenant_id) if tenant_id else None,
|
||||
tenant_slug=tenant_slug,
|
||||
roles=roles,
|
||||
permissions=permissions,
|
||||
)
|
||||
|
||||
except KeycloakError as e:
|
||||
|
||||
Reference in New Issue
Block a user