Hace unos días, algunos de mis colegas se acercaron a mí con respecto a un problema con una aplicación de código abierto llamada Makaut Buddy , que es una plataforma para compartir notas diseñada para nuestra universidad, cuyo objetivo es ayudar a los estudiantes a compartir notas importantes, preguntas de exámenes anteriores y tutoriales de YouTube de manera eficiente. .
Si bien habían desarrollado con éxito un sistema para cargar recursos, se encontraron con el desafío de garantizar que solo las personas autorizadas pudieran cargar contenido.
Como se muestra en la demostración a continuación, cualquier usuario puede crear un recurso después de registrarse. Esto planteó un gran problema porque no podíamos regular lo que subían los usuarios, algunos incluso podrían haber subido contenido dañino o perturbador.
Inicialmente, definieron una función de administrador y otorgaron privilegios administrativos a un grupo selecto de personas. Sin embargo, a medida que aumentó el número de funciones, el código se volvió cada vez más complejo y difícil de gestionar.
Fue entonces cuando tuve la idea de escribir este artículo para crear conciencia sobre formas eficientes de administrar la autorización utilizando un modelo de control de acceso basado en roles (RBAC) con la ayuda de herramientas de autorización de terceros como Permit.
Además de implementar RBAC, también introdujimos un sistema de aprobación de acceso a solicitudes. Este sistema garantiza que cualquier usuario que quiera subir contenido primero debe solicitar acceso, que luego un administrador puede aprobar o denegar. Esta capa adicional de seguridad nos ayuda a mantener la integridad del contenido en Makaut Buddy.
En este artículo, he utilizado JavaScript como lenguaje de programación y Next.js como marco. Sin embargo, los conceptos que se analizan aquí no son específicos del lenguaje y puede implementarlos en su lenguaje de programación preferido.
Al final de este artículo, sabrá cómo implementar un modelo RBAC básico en su aplicación.
Dicho esto, ¡vamos a sumergirnos!
¿Recuerdas esas mañanas corriendo a la escuela? El guardia de seguridad que verifica su identificación es un ejemplo perfecto de autenticación. Están verificando tu identidad como estudiante permitido en el campus. Pero ese es sólo el primer paso. Incluso después de ser identificado, no entrarías simplemente a ningún salón de clases, ¿verdad? Ahí es donde entra en juego la autorización.
Piense en su horario de clases como su autorización. Te otorga acceso a áreas específicas (aulas) según tu rol (estudiante matriculado en esa clase). No estaría autorizado a ingresar a la sala de profesores ni a la sección restringida de la biblioteca, aunque sea un estudiante (autenticado).
La diferencia entre Autenticación y Autorización es como preguntar "¿Quién eres?" vs "¿Qué puedes hacer?"
La autorización es importante en todas las organizaciones, ya que impide que las personas realicen acciones para las que no están autorizados. Esto garantiza la seguridad de la organización y ayuda a prevenir pérdidas.
Ilustremos la afirmación anterior con un ejemplo:
En una empresa, hay algunos ingenieros superiores con amplia experiencia y algunos pasantes que aún están aprendiendo los entresijos. Puede imaginarse el desastre que causaría si tanto el ingeniero senior como el pasante tuvieran el mismo nivel de permisos. Los becarios que aún están aprendiendo podrían, sin saberlo, cometer algún error por el que la empresa tendrá que pagar. En situaciones como estas, el modelo de control de acceso basado en roles funciona mejor porque los permisos no se asignan a personas individuales, sino que se asignan a roles. Por ejemplo, solo un ingeniero senior o un líder tecnológico puede eliminar recursos, mientras que todos los pasantes solo pueden ver y administrar recursos.
A continuación, veamos cómo podemos implementar RBAC en una aplicación.
Primero, necesitamos definir roles y asignar permisos a cada rol.
Nota: Un Rol es el puesto o propósito que alguien tiene en una organización, necesitamos roles para poder diferenciar entre individuos según los permisos o privilegios asignados a ese rol.
Necesitamos una forma de asignar un rol a cada usuario de la aplicación. Generalmente esto se hace después de que el usuario se registra.
Necesitamos una API en nuestro backend que asuma la operación que un usuario desea realizar y verifique la autorización del usuario. El siguiente diagrama le dará una mejor comprensión:
Sin embargo, no vamos a implementar todo el modelo desde cero. En su lugar, utilizaremos una herramienta de autorización de terceros llamada Permit, que hará que todo el proceso de establecimiento de la autorización sea muy sencillo y eficiente para nosotros, para que usted pueda trabajar en las funciones que realmente importan.
El siguiente diagrama muestra cómo vamos a aprovechar Permit para implementar RBAC en nuestras aplicaciones:
En esta sección, recorreremos los pasos para implementar el control de acceso basado en roles (RBAC) mediante Permit.
Como utilizamos un Permiso para establecer un modelo RBAC, primero debemos crear una cuenta de Permiso y un espacio de trabajo:
Ahora necesitamos crear un Recurso que es la entidad a la que queremos controlar el acceso en nuestra aplicación.
Por ejemplo, en una aplicación para tomar notas, el recurso sería Notas y las acciones podrían ser Crear , Leer, Actualizar y Eliminar.
Para crear un recurso:
En el ejemplo anterior, el nombre del recurso es Notas y las acciones que el usuario puede realizar son Crear, Leer, Actualizar y Eliminar.
Luego de crear el Recurso, tenemos que definir los roles que van a existir en nuestra aplicación.
En este caso, como la aplicación es una aplicación para compartir notas para una universidad, los roles van a ser:
Una vez que hemos creado ambos roles, ahora tenemos que asignar las acciones que puede realizar cada rol desde nuestro editor de políticas, como se muestra a continuación:
Ahora que su cuenta Permit está configurada, puede comenzar a crear las API de backend para comunicarse con Permit. Usaremos el SDK de Node.js proporcionado por Permit. Puede encontrar el SDK para su lenguaje de programación preferido en la documentación del permiso.
Sincronizar usuarios y asignar roles predeterminados
Primero, debemos asegurarnos de que cada usuario que se registre en nuestra aplicación esté sincronizado con el directorio de permisos y tenga asignado un rol predeterminado de Estudiante.
Para hacer esto necesitamos crear una API backend como se muestra a continuación:
Esta API hace 2 cosas:
createUser
.assignRole
.
Puede leer más sobre todas las API que Permit proporciona en los documentos de permisos.
Obtener rol de usuario
A continuación, necesitamos crear una API de backend que obtenga el rol del usuario de Permit.io y lo envíe de regreso al frontend.
La API que se muestra a continuación hace que el usuario utilice permit.api.users.get(user_key)
Esta API obtiene el rol de usuario con el que podemos manipular nuestros componentes front-end para permitir que solo las personas que tienen roles especiales puedan verlo.
También puede consultar la función permit.check() para verificar si un usuario con un rol determinado tiene permiso para realizar una operación.
Con esto, hemos implementado con éxito un modelo RBAC utilizando Permit. Ahora podemos integrar las rutas de backend con el marco de frontend o biblioteca de su elección para completar la configuración.
Para completar nuestra configuración, necesitamos un componente que permita a los usuarios solicitar actualizaciones de roles:
Los elementos Permit son parte de "Permit Share-If", que es un conjunto de componentes de interfaz de usuario integrables y prediseñados que facilitan el acceso compartido en las aplicaciones. Diseñados para proporcionar un control de acceso totalmente funcional, hacen que delegar la gestión de permisos a sus usuarios sea sencillo y seguro.
Eso es todo, hemos creado los elementos.
Antes de usar los elementos, necesitamos crear una API de backend para que el usuario inicie sesión en el elemento de permiso.
Nota: Es importante que el usuario inicie sesión lo antes posible, preferiblemente inmediatamente después de registrarse.
Ahora, veamos el código:
Código API que se sirve en el punto final /api/v1/login_permit/?userkey=user_key
:
El código de interfaz para implementar el inicio de sesión se verá así:
Eso es todo, hemos configurado nuestro código.
Ahora, solo necesitamos ir al panel de permisos y copiar tanto el iframe de administración de usuarios como el iframe de solicitud de acceso, como se muestra a continuación:
Ahora, una vez que tenemos el código, necesitamos agregar el iframe
a nuestra interfaz donde queremos mostrar los elementos a nuestros usuarios, necesitamos:
Con esto, hemos configurado con éxito un sistema de aprobación de acceso donde los usuarios pueden solicitar actualizaciones de roles y los administradores pueden aprobar o rechazar estas solicitudes.
Esta demostración muestra cómo un usuario con el rol de "Administrador" puede acceder al widget de carga.
Esta demostración ilustra cómo un usuario con el rol "Estudiante" no puede ver el widget de carga y puede solicitar una actualización al rol "Administrador":
Esta demostración muestra cómo los usuarios privilegiados pueden aprobar solicitudes de actualización de roles:
Esta demostración demuestra cómo un usuario, después de ser actualizado de "Estudiante" a "Administrador", obtiene acceso al widget de carga.
¡Eso es todo!
Gracias por leer hasta aquí.
En este tutorial, exploramos la autorización y entendimos por qué la autorización es muy importante en cualquier aplicación. También analizamos cómo podemos configurar Permit para proteger la aplicación y controlar el acceso de los usuarios según sus roles.
Este artículo es sólo la punta del iceberg de la autorización y el modelo RBAC. Puede consultar ABAC y ReBAC para obtener una autorización más detallada.