Ir al contenido principal

Gestión de perfiles y permisos en aplicaciones Web

Cuando se desarrollan aplicaciones web (o de escritorio si es del caso) que requieren manejo de usuarios, una de las características más comunes a incluir es la de asignar permisos a cada usuario dependiendo de su rol o perfil dentro de la aplicación. A continuación se describen algunas sugerencias para una correcta administración y asignación de estos permisos.

Comencemos por establecer el comportamiento de estos llamados “permisos”. Básicamente, se trata de permitir a un usuario el poder acceder a una característica como por ejemplo el editar registros de una tabla particular, por ejemplo “inventario”. Así, un usuario que tenga en su perfil asignado el acceso a “inventario/editar” podrá hacerlo, en tanto aquel que no lo tenga, no podrá realizar esta actividad. Así las cosas, podemos relacionar el permiso con un menú asociado, en este caso “inventario/editar”, igual puede hacerse con “inventario/listar”, “inventario/adicionar”, “inventario/asignar-responsable” u otras acciones similares para otras tablas o servicios de la aplicación. Esto significa que debemos definir en algún lugar todos los posibles menús que serán usados. Téngase presente que estos menús pueden estar o no directamente asociados a un script particular, como por ejemplo “/control/inventario/editar.php” (veremos un poco más sobre esto más adelante).

Ahora bien, si has prestado atención (y estoy seguro que lo has hecho) habrás notado que al declarar el menú he usado “inventario/editar” y no “editar/inventario”. Esto para que de esta forma todos los menús relacionados con el manejo de la tabla “inventario” sean del tipo “inventario/xxxx”, donde “xxxx” representa la acción de interés, así se hace más fácil el encontrar los menús que corresponden a acciones sobre una tabla o servicio en particular. Por supuesto, pueden declararse tantos niveles como se quieran, por ejemplo “inventario/elemento/retirar” o similares, y aunque puede verse como una forma de organizar una sección de menú en la interfaz de usuario de la aplicación, esto debería ser una consecuencia y no la razón de ser de la misma, porque recordemos que los menús mostrados en pantalla pueden organizarse de muchas diferentes formas según la interfaz de usuario que se esté usando. Así que mi recomendación es siempre agrupar los menús teniendo presente su funcionalidad primero que todo.

Pasemos entonces a resolver la inquietud de “¿dónde debo almacenar mi listado de menús?”. Si estamos usando bases de datos para registro de usuarios, seguro el primer pensamiento será el de incluir una tabla con ese listado base de menús. Y aunque puede ser una aproximación válida en muchos escenarios, es una que no comparto por la siguiente razón: imagina que tu aplicación está instalada en varios clientes y necesitas instalar una actualización en la que se adicionan nuevos menús. Si tu listado de menús base (todavía no hemos entrado a la parte donde se configuran para cada usuario, paciencia) se encuentra en una tabla de la base de datos, tendrás que incluir un script o secuencia de comandos adicional solamente para adicionar ese nuevo listado. Ahora bien, si el listado es tomado de un archivo incluido con los otros archivos o scripts que serán copiados durante la actualización, no requerirás ningún trabajo adicional, simplificando y reduciendo puntos de falla en dicho proceso de actualización. Así pues, la recomendación es usar un archivo dentro del repositorio de scripts, ya sea en formato texto plano, CSV, archivos .ini, JSON u otro formato de tu preferencia (como usuario Windows que soy y por su fácil manejo, me inclino usualmente por archivos .ini). Por ejemplo:

inventory/edit = /control/inventory/actions/edit.php
inventory/item/remove = /control/inventory/remove.php
inventory/item/detach = /control/inventory/remove.php?deta=1

Sugerencia para desarrolladores: Asociar el path del menú con la ubicación del script puede ser una forma rápida de invocar dicho script, aunque también puede usarse el archivo de definiciones para indicar a qué script corresponde cada menú y evitar así las limitaciones de verse forzado a crear un script para cada menú, tal como se muestra en el ejemplo de arriba.

Una vez se haya leído la lista de menús disponibles, en tu sistema de Administración de usuarios puedes ya proceder a vincularlos a cada usuario, usando el método que mejor se acomode a tu sistema (ahora si, lo ideal sería mediante vínculos entre tablas de una base de datos). Si tienes varios usuarios que tendrán acceso a los mismos menús, quizás prefieras no realizar la asociación usuario→menú, sino algo intermedio, crear primero un listado de (adivinas?) perfiles. Pero, ¿a qué hace referencia “perfiles” en este contexto? Pues a una agrupación de menús disponibles designados con nombres característicos como “Administrador”, “visitante” o “usuario básico”, entre otros. De esta forma, la asociación a realizar será usuario→perfil→menú.

Ya para terminar, hay que tener presente que pueden existir usuarios con privilegios o excepciones especiales y que a pesar de pertenecer a un determinado perfil, requieran que les sean asignados menús adicionales o por el contrario, bloquear alguno ya permitido. En este caso, la solución podría ser una de las siguientes:

  •  Crear un nuevo perfil. Sin embargo, es posible que la aplicación tenga algunas acciones que por seguridad (o por decisiones “creativas”) solamente se permitan a usuarios con un perfil especifico y al asignarle uno diferente dejaría al usuario sin posibilidad de usarlo aun cuando tenga el permiso asignado.
  • Asignarle al usuario menús adicionales o restringir el uso de ciertos menús, de forma que se use primero la relación usuario→perfil→menú y luego se complemente con los adicionales que encuentre y/o excluya las excepciones, cada una asignada en una relación directa del tipo usuario→menú.
  • Permitir asignar al usuario más de un perfil (como sucede con muchos Sistemas Operativos).

Resumiendo:

  • Crear un listado con todas las opciones de menú permitidas en la aplicación.
  • Registrar el listado de opciones validas en un archivo texto (CSV, INI, JSON u otro).
  • Crear una administración de perfiles donde se asocien los menús.
  • Incluir en la administración de usuario la asociación al perfil de interés, ya sea en una relación de uno a uno o de uno a varios, entre usuarios y perfiles.
  • Opcionalmente, incluir para cada usuario la opción de asignar menús extra o excluir menús incluidos en el perfil.

¡Y eso es todo, amigos! Con estas sugerencias ya solo queda a) sentarse y buscar en Internet el administrador de perfiles que mejor se acomode a tus necesidades o b) codificar uno propio, ¿qué prefieres?

Si te gustó este contenido y te ha resultado útil, si tienes alguna observación o consideras que requiere alguna corrección o si simplemente quieres dejar un saludo, no dudes en dejar un  comentario, será un gesto apreciado y de esta forma ayudas a mejorar estos contenidos.

¡Hasta una próxima!

Imagen de fondo cortesía de Pixabay.

Comentarios

Entradas populares de este blog

Sesión de usuarios en aplicaciones web

Uno de los módulos más importantes y a la vez menospreciados cuando se aborda la tarea de crear un sitio web de servicios, ya sea para una intranet corporativa o un sistema de gestión de información ( SGI ) es la gestión y administración  requerida para una correcta implementación de sesiones de usuario. Y es que llevamos tanto tiempo usando usuarios y contraseñas en Internet, en cualquiera de sus muchas variaciones, que se asume muchas veces que esto ya forma parte del ADN de toda solución web y como tal, se destina muy poco tiempo y estudio a este apartado cuando se planifican las actividades de desarrollo. Lo cierto es que cada aplicación acostumbra desarrollar su propio esquema de manejo de sesiones y asumir que es algo superfluo puede equivaler a “pegarse un tiro en el pie”, especialmente cuando un módulo de este tipo se diseña desde ceros. Al referirse al manejo de sesiones de usuario suele pensarse únicamente en el proceso de capturar el nombre de usuario ( username ) y su cont

Configurando el servicio PHP

En el capítulo anterior ( PHP con Apache sobre Windows ) vimos como configurar PHP para ejecutarse desde un servidor web usando Apache. A continuación veremos los elementos a configurar directamente en PHP para garantizar una ejecución responsable y sin tropiezos de nuestros scripts. Algunos se preguntarán ¿ por qué  molestarse en configurar manualmente PHP cuando frameworks como Laravel  ya te entregan un docker con todo preinstalado y preconfigurado? Bueno, la verdad prefiero tener control de qué está ejecutándose en mi maquina y no me gusta, en lo particular, requerir de un entorno propietario para cada aplicación desarrollada cuando puedo tener uno para todas y no desperdiciar espacio en disco , memoria y/o procesador  ejecutando en cada proyecto un servidor wen y/o PHP por separado. Si, se que muy probablemente soy una minoría en este aspecto, mea culpa . Y en segundo lugar, nunca se sabe cuando tendrás que entrar y ajustar tu configuración de PHP, así que cuando ese día ll

Cómo resolver y/o crear un Sudoku usando PHP (parte 1)

C omo programador, he tenido que realizar proyectos profesionalmente, algunos con mayores retos que otros. Pero aparte de los retos profesionales, existen retos personales, programas que me nace escribir ya sea porque necesito solucionar una necesidad puntual o solamente por el placer de hacerlo. Uno de esos últimos retos fue el de solucionar un Sudoku . Si ya se, existen muchas aplicaciones allí afuera que lo hacen, pero el reto es hacerlo, no copiarlo. Habiendo aclarado las intenciones al respecto, lo primero a tener claro es cómo se define un Sudoku. Para esto, voy a apoyarme en la siempre disponible (aunque no siempre fiable) Wikipedia: Un Sudoku estándar contiene 81 celdas, dispuestas en una trama de 9×9, que está subdividida en nueve cajas. Cada caja está determinada por la intersección de tres filas con tres columnas. Cada celda puede contener un número del uno al nueve y cada número solo puede aparecer una vez en cada fila, cada columna o cada caja. Un sudoku comienza con algu