Español
  • rbac
  • diseño de roles
  • implementación rbac

RBAC en práctica: Implementando una autorización segura para tu aplicación

Guía completa de Control de Acceso Basado en Roles (RBAC): Domina el diseño de permisos, la gestión de roles y la autorización segura con una implementación práctica de CMS.

Yijun
Yijun
Developer

Deja de perder semanas en la autenticación de usuarios
Lanza aplicaciones seguras más rápido con Logto. Integra la autenticación de usuarios en minutos y concéntrate en tu producto principal.
Comenzar
Product screenshot

¿Estás luchando con la implementación de un sistema de autorización seguro y escalable para tu aplicación? El Control de Acceso Basado en Roles (RBAC) es el estándar de la industria para gestionar los permisos de usuarios, pero implementarlo correctamente puede ser un desafío. Este tutorial te mostrará cómo construir un sistema RBAC robusto usando un ejemplo real de un Sistema de Gestión de Contenidos (CMS).

Siguiendo esta guía, aprenderás:

  • ✨ Cómo diseñar e implementar permisos detallados que te proporcionen un control preciso
  • 🔒 Mejores prácticas para organizar permisos en roles significativos
  • 👤 Técnicas para manejar eficazmente la propiedad de recursos
  • 🚀 Maneras de hacer tu sistema de autorización escalable y mantenible
  • 💡 Implementación práctica usando un ejemplo de CMS del mundo real

El código fuente completo para este tutorial está disponible en GitHub.

Entendiendo los fundamentos de RBAC

El Control de Acceso Basado en Roles es más que solo asignar permisos a los usuarios. Se trata de crear un enfoque estructurado para la autorización que equilibre la seguridad con el mantenimiento.

Puedes aprender más sobre Qué es RBAC en Auth Wiki.

Aquí están los principios clave que seguiremos en nuestra implementación:

Diseño de permisos detallados

Los permisos detallados te dan control preciso sobre lo que los usuarios pueden hacer en tu sistema. En lugar de niveles de acceso amplios como "admin" o "usuario", definimos acciones específicas que los usuarios pueden realizar sobre los recursos. Por ejemplo:

  • read:articles - Ver cualquier artículo en el sistema
  • create:articles - Crear nuevos artículos
  • update:articles - Modificar artículos existentes
  • publish:articles - Cambiar el estado de publicación de los artículos

Propiedad de recursos y control de acceso

La propiedad de recursos es un concepto fundamental en el diseño de autorización de nuestro CMS. Mientras que RBAC define qué acciones pueden realizar diferentes roles, la propiedad agrega una dimensión personal al control de acceso:

  • Los autores tienen automáticamente acceso a los artículos que crearon
  • Este modelo de propiedad natural significa que los autores siempre pueden ver y editar su propio contenido
  • El sistema verifica tanto permisos de rol O propiedad al manejar operaciones de artículos
  • Por ejemplo, incluso sin el permiso update:articles, un autor aún puede editar sus propios artículos
  • Este diseño reduce la necesidad de permisos de rol adicionales mientras mantiene la seguridad

Este enfoque de doble capa (roles + propiedad) crea un sistema más intuitivo y seguro. Los editores y administradores aún pueden gestionar todo el contenido a través de sus permisos de rol, mientras que los autores mantienen el control sobre su propio trabajo.

Diseñando APIs seguras

Comencemos diseñando la funcionalidad central de nuestro CMS a través de sus puntos de conexión API:

Implementar control de acceso para tu API

Para cada punto de conexión, necesitamos considerar dos aspectos del control de acceso:

  1. Propiedad de recursos - ¿El usuario es dueño de este recurso?
  2. Permisos basados en roles - ¿El rol del usuario permite esta operación?

Así manejaremos el acceso para cada punto de conexión:

EndpointLógica de control de acceso
GET /api/articles- Cualquiera con permiso list:articles, O autores pueden ver sus propios artículos
GET /api/articles/:id- Cualquiera con permiso read:articles, O autor del artículo
POST /api/articles- Cualquiera con permiso create:articles
PATCH /api/articles/:id- Cualquiera con permiso update:articles, O autor del artículo
DELETE /api/articles/:id- Cualquiera con permiso delete:articles, O autor del artículo
PATCH /api/articles/:id/published- Solo usuarios con permiso publish:articles

Creando un sistema de permisos que escale

Basándonos en nuestros requisitos de acceso a la API, podemos definir estos permisos:

PermisoDescripción
list:articlesVer la lista de todos los artículos en el sistema
read:articlesLeer el contenido completo de cualquier artículo
create:articlesCrear nuevos artículos
update:articlesModificar cualquier artículo
delete:articlesEliminar cualquier artículo
publish:articlesCambiar el estado de publicación

Ten en cuenta que estos permisos solo son necesarios cuando accedes a recursos que no son de tu propiedad. Los propietarios de artículos pueden automáticamente:

  • Ver sus propios artículos (no se necesita read:articles)
  • Editar sus propios artículos (no se necesita update:articles)
  • Eliminar sus propios artículos (no se necesita delete:articles)

Construyendo roles efectivos

Ahora que hemos definido nuestra API y permisos, podemos crear roles que agrupen estos permisos lógicamente:

Permiso/Rol👑 Admin📝 Editor✍️ Autor
DescripciónAcceso completo al sistema para una gestión total de contenidoPuede ver todos los artículos y controlar el estado de publicaciónPuede crear nuevos artículos en el sistema
list:articles
read:articles
create:articles
update:articles
delete:articles
publish:articles

Nota: Los autores tienen automáticamente permisos de lectura/actualización/eliminación para sus propios artículos, independientemente de los permisos de rol.

Cada rol está diseñado con responsabilidades específicas en mente:

  • Admin: Tiene control completo sobre el CMS, incluyendo todas las operaciones de artículos
  • Editor: Se enfoca en la revisión de contenido y gestión de publicación
  • Autor: Se especializa en la creación de contenido

Esta estructura de roles crea una clara separación de responsabilidades:

  • Los autores se enfocan en crear contenido
  • Los editores gestionan la calidad y visibilidad del contenido
  • Los administradores mantienen el control general del sistema

Configurar RBAC en Logto

Antes de comenzar, necesitas crear una cuenta en Logto Cloud, o también puedes utilizar una instancia de Logto auto-hospedada utilizando la versión Logto OSS.

Pero para este tutorial, utilizaremos Logto Cloud para simplicidad.

Configurando tu aplicación

  1. Ve a "Aplicaciones" en Logto Console para crear una nueva aplicación react
    • Nombre de la aplicación: Sistema de Gestión de Contenidos
    • Tipo de aplicación: Aplicación Web Tradicional
    • URIs de redirección: http://localhost:5173/callback

Aplicación React CMS

Configurando recursos de API y permisos

  1. Ve a "Recursos de API" en Logto Console para crear un nuevo recurso de API
    • Nombre de la API: API del CMS
    • Identificador de la API: https://api.cms.com
    • Agrega permisos al recurso de API
      • list:articles
      • read:articles
      • create:articles
      • update:articles
      • publish:articles
      • delete:articles

Detalles del recurso API CMS

Creando roles

Ve a Roles en Logto Console para crear los siguientes roles para el CMS

  • Admin
    • con todos los permisos
  • Editor
    • con read:articles, list:articles, publish:articles
  • Autor
    • con create:articles

Rol Admin

Rol Editor

Rol Autor

Asignando roles a usuarios

Ve a la sección de "Gestión de usuarios" en Logto Console para crear usuarios.

En la pestaña "Roles" de los detalles del usuario, puedes asignar roles al usuario.

En nuestro ejemplo, creamos 3 usuarios con los siguientes roles:

  • Alex: Admin
  • Bob: Editor
  • Charlie: Autor

Gestión de usuarios

Detalles del usuario - Alex

Integrar tu frontend con Logto RBAC

Ahora que hemos configurado RBAC en Logto, podemos comenzar a integrarlo en nuestro frontend.

Primero, sigue los Comienzos rápidos de Logto para integrar Logto en tu aplicación.

En nuestro ejemplo, usamos React para demostración.

Después de haber configurado Logto en tu aplicación, necesitamos agregar las configuraciones RBAC para que Logto funcione.

Recuerda cerrar sesión y volver a iniciar sesión para que este cambio surta efecto si ya has iniciado sesión.

Cuando el usuario inicia sesión con Logto y solicita un token de acceso para los recursos de API especificados anteriormente, Logto agregará alcances (permisos) relacionados con el rol del usuario al token de acceso.

Puedes usar getAccessTokenClaims del hook useLogto para obtener los alcances del token de acceso.

Y puedes usar userScopes para verificar si el usuario tiene el permiso para acceder al recurso.

Integrar tu backend con Logto RBAC

Ahora, es hora de integrar Logto RBAC en tu backend.

Middleware de autorización en el backend

Primero, necesitamos agregar un middleware en el backend para verificar los permisos de los usuarios, verificar si el usuario ha iniciado sesión y determinar si tienen los permisos necesarios para acceder a ciertas APIs.

Como puedes ver, en este middleware, verificamos si la solicitud del frontend contiene un token de acceso válido y comprobamos si la audiencia del token de acceso coincide con el recurso API que creamos en Logto Console.

La razón para verificar el recurso API es que nuestro recurso API en realidad representa los recursos de nuestro backend CMS, y todos nuestros permisos de CMS están asociados con este recurso API.

Dado que este recurso API representa los recursos del CMS en Logto, en nuestro código frontend, incluimos el token de acceso correspondiente al realizar solicitudes de API al backend:

Ahora podemos usar el middleware requireAuth para proteger nuestros puntos de conexión de API.

Protegiendo puntos de conexión de API

Para APIs que solo deberían ser accesibles para usuarios con permisos específicos, podemos añadir restricciones directamente en el middleware. Por ejemplo, la API de creación de artículos solo debería ser accesible para usuarios con el permiso create:articles:

Para APIs que necesitan verificar tanto permisos como propiedad de recursos, podemos usar la función hasScopes. Por ejemplo, en la API de lista de artículos, los usuarios con el permiso list:articles pueden acceder a todos los artículos, mientras que los autores pueden acceder a sus propios artículos creados:

En este punto, hemos completado la implementación de RBAC. Puedes consultar el código fuente completo para ver la implementación completa.

Probar la implementación de RBAC en el CMS

Ahora, probemos nuestra implementación de RBAC en el CMS utilizando los tres usuarios que acabamos de crear.

Primero, iniciemos sesión como Alex y Charles respectivamente y creemos algunos artículos.

Dado que Alex tiene el rol de Admin, puede crear, eliminar, actualizar, publicar y ver todos los artículos.

Tablero del CMS - Alex

Charles, con el rol de Autor, solo puede crear sus propios artículos y solo puede ver, actualizar y eliminar artículos que son de su propiedad.

Tablero del CMS - Charles - Lista de Artículos

Bob, con el rol de Editor, puede ver y publicar todos los artículos pero no puede crearlos, actualizarlos o eliminarlos.

Tablero del CMS - Bob

Conclusión

¡Felicitaciones! Has aprendido cómo implementar un sistema RBAC robusto en tu aplicación.

Para escenarios más complejos, como construir aplicaciones multi-inquilino, Logto proporciona un soporte organizacional integral. Consulta nuestra guía Construir una aplicación SaaS multi-inquilino: Una guía completa desde el diseño hasta la implementación para aprender más sobre cómo implementar el control de acceso a nivel organizacional.

¡Feliz programación! 🚀