Publicado el

🔐 Estrategias de autorización en aplicaciones

app authorization image

La autorización define qué puede hacer un usuario dentro de tu sistema, una vez autenticado. Es clave para proteger recursos, datos y funcionalidades.


1. 🛡️ Role-Based Access Control (RBAC)

Permisos basados en roles (admin, user, editor, etc.).

🧠 ¿Cómo funciona?

Asignas roles a usuarios y cada rol tiene permisos predefinidos.

🛠 Ejemplo

const roles = {
  admin: ["create", "read", "update", "delete"],
  user: ["read"],
};

function can(user, action) {
  return roles[user.role].includes(action);
}

✅ Ventajas

  • Fácil de implementar
  • Escalable en sistemas simples

⚠️ Desventajas

  • Poco flexible en casos complejos

🎯 Cuándo usarlo

  • Apps tradicionales
  • Sistemas con jerarquías claras

2. 🔑 Permission-Based Access

Permisos asignados directamente a usuarios o recursos.

🧠 Concepto

En lugar de roles, defines permisos específicos:

  • user:create
  • post:edit
  • invoice:delete

🛠 Ejemplo

function can(user, permission) {
  return user.permissions.includes(permission);
}

✅ Ventajas

  • Gran flexibilidad
  • Control fino

⚠️ Desventajas

  • Difícil de mantener a gran escala

🎯 Cuándo usarlo

  • Apps con lógica compleja
  • Sistemas personalizados

3. 🧠 Attribute-Based Access Control (ABAC)

Acceso basado en atributos y contexto.

🧠 ¿Qué evalúa?

  • Usuario (rol, edad, ubicación)
  • Recurso (propietario, tipo)
  • Contexto (hora, IP, dispositivo)

🛠 Ejemplo

function canAccess(user, resource) {
  return user.id === resource.ownerId || user.role === "admin";
}

✅ Ventajas

  • Muy flexible y potente
  • Ideal para reglas complejas

⚠️ Desventajas

  • Implementación compleja
  • Difícil de depurar

🎯 Cuándo usarlo

  • Sistemas empresariales
  • Apps con reglas dinámicas

4. 📂 Ownership Access

Solo el dueño del recurso puede acceder o modificarlo.

🧠 Concepto

El acceso depende de la propiedad del recurso.

🛠 Ejemplo

if (resource.userId !== currentUser.id) {
  throw new Error("No autorizado");
}

✅ Ventajas

  • Simple
  • Seguro

⚠️ Desventajas

  • Limitado si hay roles o colaboración

🎯 Cuándo usarlo

  • Apps personales (notas, tareas)
  • CRUD básico

5. 🚩 Feature Flags

Controlar acceso a funcionalidades según usuario, plan o entorno.

🧠 ¿Cómo funciona?

Activas/desactivas features dinámicamente.

🛠 Ejemplo

if (user.plan === "pro") {
  enableFeature("advancedAnalytics");
}

✅ Ventajas

  • Despliegues seguros
  • Testing en producción
  • Control por segmentos

⚠️ Desventajas

  • Puede generar complejidad si no se gestiona bien

🎯 Cuándo usarlo

  • SaaS
  • Lanzamiento progresivo
  • A/B testing

6. 🏢 Multi-Tenant Isolation

Separación de datos entre clientes o empresas.

🧠 Concepto

Cada tenant (cliente) solo accede a sus propios datos.

🛠 Ejemplo

const data = await db.find({
  tenantId: currentUser.tenantId,
});

✅ Ventajas

  • Seguridad entre clientes
  • Escalabilidad en SaaS

⚠️ Desventajas

  • Complejidad en diseño
  • Requiere buen modelado de datos

🎯 Cuándo usarlo

  • Plataformas SaaS
  • Apps multiempresa

⚖️ Comparativa rápida

EstrategiaFlexibilidadComplejidadEscalabilidadIdeal para
RBACMediaBajaAltaApps simples
PermissionsAltaMediaMediaSistemas complejos
ABACMuy altaAltaAltaEmpresas grandes
OwnershipBajaBajaMediaCRUD básico
Feature FlagsAltaMediaAltaSaaS
Multi-TenantAltaAltaMuy altaPlataformas SaaS

🧠 Arquitectura recomendada (realista)

En la práctica, se combinan varias estrategias:

RBAC + Ownership + Feature Flags + Multi-Tenant

Ejemplo real:

  • RBAC → define roles
  • Ownership → protege datos
  • Feature flags → controla features
  • Multi-tenant → separa clientes

🏁 Resumen

No existe una única estrategia perfecta. La clave está en:

  • 🔍 Entender tu dominio
  • 🔐 Definir reglas claras
  • ⚙️ Mantener el sistema simple al inicio