Skip to content

Seguridad y RBAC

La seguridad en Yastubo se basa en la protección de los datos sensibles de los migrantes y sus familias. Hemos implementado un sistema robusto de Control de Acceso Basado en Roles (RBAC) y una estructura de Multi-tenancy (Companys) para asegurar la privacidad de la información.

  • Aislamiento de Datos: Cada usuario opera dentro de uno o más “Companys”, garantizando que la información de un reseller no sea visible para otro.
  • Granularidad de Permisos: Los endpoints de la API están protegidos por roles específicos que definen qué acciones puede realizar cada usuario.
  • Autenticación Stateless: Utilizamos JWT (JSON Web Tokens) para una autenticación rápida y segura, permitiendo el escalamiento horizontal.

Deep Dive Técnico: Gestión de Roles y Permisos

Section titled “Deep Dive Técnico: Gestión de Roles y Permisos”

El sistema utiliza un decorador require_role para inyectar lógica de autorización directamente en los endpoints de FastAPI.

  1. SUPER_ADMIN: Acceso total a todos los módulos y configuraciones del sistema.
  2. ADMIN: Gestión de pólizas, beneficiarios y pagos dentro de su company.
  3. OPERATOR: Gestión operativa básica (ej. soporte a siniestros).
  4. RESELLER: Solo acceso a sus propios leads y pólizas emitidas.
app/modules/auth/dependencies.py
def require_role(*roles: str) -> Callable:
def role_checker(user: User = Depends(get_current_user)):
user_roles = [role.name for role in user.roles]
# Verificamos si el usuario posee al menos uno de los roles requeridos
if not any(role in user_roles for role in roles):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="No tienes permisos suficientes para realizar esta acción"
)
return user
return role_checker

Este enfoque asegura que el código de negocio no tenga que preocuparse por la lógica de autorización, ya que es gestionada por la capa de dependencias de la API.

El sistema permite que un usuario pertenezca a múltiples entornos de trabajo. Para gestionar esto, el backend espera un header X-Company-Id en las peticiones que requieren contexto de empresa.

Si un usuario pertenece a un solo company, el sistema lo selecciona automáticamente. Si pertenece a varios, debe especificarlo en el header:

app/modules/auth/dependencies.py
async def get_current_company_id(
user: User = Depends(get_current_user),
company_id: Optional[uuid.UUID] = Header(None, alias="X-Company-Id"),
) -> uuid.UUID:
# Lógica de validación de pertenencia al company...

Esto previene accesos accidentales o malintencionados a datos de otros clientes u organizaciones.

Security & RBAC Flow