Sistema de permisos usando PHP y JS

7

Estoy desarrollando un panel de administración con diferentes áreas, donde diferentes usuarios pueden tener diferentes permisos. Por ejemplo:

  • Noticias
    • John: editar, ver, agregar, eliminar;
    • Carlos: editar, ver;
    • Mario: -;
  • Soporte
    • Juan: ver;
    • Carlos: editar, ver;
    • Mario: editar, ver, agregar, eliminar;

La forma en que controlo este permiso es a través de la matriz JSON, que contiene cada área y lista de permisos. Guardo esto en mi base de datos MySql (serializando primero) y también en el localStorage. De esta manera puedo verificar en la interfaz pero también hacer una validación final en el lado del servidor, a través de PHP.

Ejemplo JSON:

{
    "area": "news",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": true},
        {"field": "add", "value": true},
        {"field": "remove", "value": true}
    ]
},
{
    "area": "support",
    "permission": [
        {"field": "access", "value": true},
        {"field": "read", "value": true},
        {"field": "edit", "value": false},
        {"field": "add", "value": false},
        {"field": "remove", "value": false}
    ]
},
...

Tengo dudas sobre este sistema porque, primero, nunca hice nada como esto y no encontré ningún ejemplo, así que no sé si esta es la forma correcta de hacerlo. Además, estoy almacenando esto como JSON porque hay usuarios administradores que necesitan editar (con la casilla de verificación) estos permisos, por lo que es más fácil mostrar esto en la interfaz.

Pero estoy muy abierto a cambiar este método según otros criterios que creas que son mejores. Solo quiero tener seguridad primero y también fácil de mantener.

    
pregunta celsomtrindade 28.12.2016 - 16:07

2 respuestas

3

Descargo de responsabilidad: no soy un experto en este tipo de asuntos, solo estoy compartiendo cómo nuestro senior y yo estamos haciendo nuestro proyecto actual.

Base de datos :

Su diseño parece lo suficientemente sólido, pero pensaría en cómo mantendría estos permisos en una tabla.

digamos que tenemos una tabla users

user_id | name | password
-------------------------
      0 | John |     ****

Puedo ver 2 formas posibles de extender nuestra base de datos para tener estos permisos.

Puedes agregar columnas de permisos que indican lo que cada usuario puede hacer

user_id | name | password| perm1 | perm2 | ... |permn
------------------------------------------------------
      0 | John |     ****|     Y |     N |     |    Y

Eso implicará tener muchas columnas y un diseño desordenado. en el lado positivo, tendrá la granularidad de dictar exactamente lo que uno puede y no puede hacer.

Sin embargo, puedes agregar el concepto de roles a tu diseño.

Puede crear una tabla roles , definir los tipos de roles de usuario (y el tipo de permisos que proporcionan) en su aplicación y simplemente asignarle un rol a cada usuario

user_id | name | password|  role_id
-----------------------------------
      0 | John |     ****|        1

Y la tabla roles

role_id | role_name  | perm1 |....| permn
----------------------------------------
      0 | Admin      |     Y |    |    Y
      1 | Regular    |     N |    |    Y

De esta manera, creará una separación de preocupaciones para la tabla de sus usuarios, en lugar de colocar todos sus datos de usuario en una tabla que puede crecer con el tiempo (no es divertido manejar docenas de columnas en una tabla), puede colocar un usuario relevante separado Datos a través de múltiples tablas. también mantendrá tus consultas cortas.

(Esto es similar a cómo las aplicaciones web Java proporcionan privilegios / permisos a usuarios )

PHP:

Para su vista de cliente, puede mantener un objeto de sesión que describa al usuario actual, puede usar el valor role para decirle a sus scripts de PHP qué partes de sus plantillas desea generar para su usuario.

Ejemplo (blade):

@if (user($role) === 'admin')
    <button id="dontclickme">History eraser button</button>
@endif
    
respondido por el svarog 29.12.2016 - 10:52
0

Por lo tanto, su implementación para el front-end no me parece mala. Es posible que desee pensar cómo va a utilizar los permisos específicamente con js, y ver si está satisfecho con la estructura del json en función de eso.

WRT al back-end, trato de no almacenar JSON directamente en la base de datos. Si tiene que realizar cualquier trabajo sobre esos datos directamente a través de la db, será muy ineficiente, especialmente a medida que su número de usuarios crezca.

En general, con algo como esto, primero vería si encuentra algo que se ajuste a sus necesidades en compositor . Si nada lo hace, es posible que desee ver algunos paquetes y ver si puede encontrar alguna inspiración si tiene dudas sobre su propia implementación.

    
respondido por el unflores 28.12.2016 - 16:59

Lea otras preguntas en las etiquetas