feat(security): implement permission checks in tenant CRUD routes and enhance API error handling
This commit is contained in:
@@ -11,34 +11,6 @@ from core.database import get_core_db
|
||||
from core.security import get_current_user # Asumiendo que existe esta función
|
||||
from .service import PermissionService
|
||||
|
||||
|
||||
# Dependencia para obtener el ID del cliente del header o contexto
|
||||
async def get_client_id(
|
||||
x_client_id: Optional[str] = Header(None, alias="X-Client-ID")
|
||||
) -> int:
|
||||
"""
|
||||
Obtiene el ID del cliente desde el header de la petición.
|
||||
|
||||
En producción, esto podría obtenerse de:
|
||||
- Un header HTTP (X-Client-ID)
|
||||
- Un subdomain (cliente1.miapp.com)
|
||||
- El token JWT del usuario
|
||||
- La sesión del usuario
|
||||
"""
|
||||
if not x_client_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Client ID is required. Provide X-Client-ID header.",
|
||||
)
|
||||
|
||||
try:
|
||||
return int(x_client_id)
|
||||
except ValueError:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid client ID format"
|
||||
)
|
||||
|
||||
|
||||
# Dependencia para obtener el servicio de permisos
|
||||
def get_permission_service(db: Session = Depends(get_core_db)) -> PermissionService:
|
||||
"""
|
||||
@@ -72,9 +44,9 @@ class PermissionChecker:
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
client_id: int = Depends(get_client_id),
|
||||
permission_service: PermissionService = Depends(get_permission_service),
|
||||
client_id: int,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
permission_service: PermissionService = Depends(get_permission_service),
|
||||
):
|
||||
"""
|
||||
Verifica que el usuario tenga los permisos requeridos.
|
||||
@@ -130,8 +102,8 @@ class RequirePermission:
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
client_id: int = Depends(get_client_id),
|
||||
client_id: int,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
permission_service: PermissionService = Depends(get_permission_service),
|
||||
):
|
||||
user_id = current_user.get("sub") or current_user.get("id")
|
||||
@@ -212,8 +184,8 @@ def require_permissions(*permissions: str, require_all: bool = True):
|
||||
|
||||
# Función helper para obtener permisos del usuario actual
|
||||
async def get_current_user_permissions(
|
||||
current_user: dict = Depends(get_current_user),
|
||||
client_id: int = Depends(get_client_id),
|
||||
client_id: int,
|
||||
current_user: dict = Depends(get_current_user),
|
||||
permission_service: PermissionService = Depends(get_permission_service),
|
||||
) -> set:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user