Pregunta

Soy parte de un equipo que crea una aplicación web usando PHP y MySQL. La aplicación tendrá múltiples usuarios con diferentes roles. La aplicación también se utilizará de manera distribuida geográficamente. Por consiguiente, debemos crear un sistema de control de acceso que funcione en los dos niveles siguientes:

  1. Controla los permisos de usuario para páginas php específicas, es decir, proporciona o niega el acceso a páginas específicas (o elementos de la interfaz de usuario) según la función del usuario. Por ejemplo: a un usuario se le puede permitir el acceso a " Estudiantes " página, pero no a la sección " Profesores " página.
  2. Controla los permisos de usuario para registros específicos de la base de datos, es decir, modifica las consultas de la base de datos para que solo se muestren registros específicos. Por ejemplo, para un usuario en el nivel de la ciudad, solo se deben mostrar los registros que se relacionan con la ciudad particular del usuario, mientras que para un usuario en el nivel nacional, se deben mostrar los registros de TODAS LAS CIUDADES en el país.

Necesito ayuda para diseñar un sistema que pueda manejar ambos tipos de control de acceso. Punto no. 1 parece ser lo suficientemente simple. Sin embargo, estoy completamente perdido sobre cómo hacer el punto número 2 sin codificar la información en las consultas SQL.

Cualquier ayuda sería apreciada.

Gracias de antemano

Vinayak

¿Fue útil?

Solución

Estuve en una situación similar hace unos meses. Descubrí que las herramientas como Zend_ACL funcionan bien si solo verifica el nivel de acceso a un solo elemento (o un número razonablemente bajo de ellos). Falla cuando necesitas obtener una gran lista de elementos a los que el usuario tiene acceso. Diseñé una solución personalizada para este problema utilizando el patrón Delegado comercial . BD proporciona lógica de negocios que se puede aplicar en un contexto específico. En este escenario, se entregó una lógica SQL y se usó como condición de filtrado en la subselección. Vea los siguientes diagramas:

 texto alternativo
(fuente: epsi.pl ??)

Y diagrama de secuencia que ilustra el orden de las llamadas:

 texto alternativo
(fuente: epsi.pl ??)

Hice un blog sobre esta solución , desafortunadamente, todo está en polaco, pero es posible que encuentre piezas de código y diagramas a mano. Lo que puedo decir es que la implementación no es fácil, pero en términos de rendimiento es un campeón en comparación con la verificación de acceso iterativo para cada elemento de la lista. Además, la infraestructura anterior no maneja solo un tipo de elementos en la lista. Puede servir para acceder a diferentes listas, ya sea lista de ciudades, países, productos o documentos, siempre que los elementos en la lista implementen la interfaz IAuthorizable .

Otros consejos

No conozco los detalles de su problema, pero Zend Framework tiene un ACL y AUTH conjunto de componentes que Tal vez quiera mirar. Buenas cosas como control de acceso muy preciso, almacenamiento de datos para persistencia, reglas condicionales avanzadas.

Me parece que lo que necesitas es esto: (usaré un ejemplo de país / estado / ciudad)

  1. Una lista de todos los países. Cada " país " tiene una identificación.
  2. Una lista de todos los estados dentro de los países. Cada estado está vinculado a la ID del país, pero también tiene su propia ID única.
  3. Una lista de todas las ciudades. Cada ciudad está vinculada a un estado, o directamente a un país, y tiene una bandera para indicar cuál.

Para un usuario de la ciudad, obviamente busque y muestre solo aquellos registros pertenecientes a la ciudad que coincida con su ID. Sin embargo, para un nivel estatal o nacional, busque todos los registros correspondientes a cada ciudad que tenga una identificación que coincida con esa nación (o estado o lo que tenga).

Básicamente, cada subgrupo depende del grupo que está arriba, y aunque no recuerdo correctamente, creo que puedes usar las subconsultas para hacer el truco desde allí.

Si no sabes cómo hacerlo, usaría un framework php como Zend Framework, CakePHP o Symphony. Han hecho el trabajo pesado por usted y ya tienen instalado algún tipo de esquema de control de acceso.

Tengo una solución similar para compilar y hasta ahora he decidido usar especificaciones y roles, por lo que de hecho, un rol tendría algunas especificaciones de privilegio adjuntas. Si todos están satisfechos, se otorga el permiso; de lo contrario, se vuelve al acceso predeterminado del recurso.

Estaba buscando a alguien que ya estuviera implementando la solución, pero parece que nadie lo hizo. Esperemos que no sea un fracaso :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top