sesiones - sistema de registro php
Sistema de control de acceso PHP (5)
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 usará de forma distribuida geográficamente. En consecuencia, necesitamos crear un sistema de control de acceso que opere en los siguientes dos niveles:
- 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) en función del rol del usuario. Por ejemplo: un usuario puede tener acceso a la página "Estudiantes" pero no a la página "Maestros".
- 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 a nivel de la ciudad, solo deben mostrarse los registros que se relacionan con la ciudad particular del usuario, mientras que para un usuario a nivel nacional, deben mostrarse los registros de TODAS LAS CIUDADES del 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 por adelantado
Vinayak
Me parece que lo que necesitas es esto: (Usaré un ejemplo de país / estado / ciudad)
- Una lista de todos los países. Cada "país" tiene una identificación.
- Una lista de todos los Estados dentro de los países. Cada estado está vinculado a la ID de coutnry, pero también tiene su propia identificación única.
- 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 coinciden 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 sea).
Entonces, básicamente, cada subgrupo depende del grupo que está sobre él, y aunque no recuerdo correctamente, creo que puede usar subconsultas para hacer el truco desde allí.
Si no sabes cómo hacerlo, utilizaría un marco de php como Zend Framework, CakePHP o Symphony. Han hecho todo el trabajo pesado por usted y tienen algún tipo de esquema de control de acceso ya implementado.
Estuve en una situación similar hace unos meses. Descubrí que las herramientas como Zend_ACL funcionan muy bien si solo se comprueba el nivel de acceso a un solo elemento (o un número razonablemente bajo de ellos). Falla cuando necesita obtener una gran lista de elementos a los que el usuario puede acceder. Diseñé una solución personalizada para este problema utilizando el patrón Delegado de negocios . BD proporciona lógica empresarial que se puede aplicar en un contexto específico. En este escenario, se entregó una lógica SQL y se utilizó como condición de filtrado en subselección. Vea los siguientes diagramas:
texto alternativo http://gruz.epsi.pl/g/uml/permissions.png
Y diagrama de secuencia que ilustra el orden de las llamadas:
texto alternativo http://gruz.epsi.pl/g/uml/permissions-s2.png
Bloggeé sobre esta solución , desafortunadamente todo está en polaco, pero puede encontrar fragmentos de código y diagramas a mano. Lo que puedo decir es que la implementación no es fácil, pero en lo que se refiere al 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 maneja no solo un tipo de elementos en la lista. Puede servir cuando se accede a listas diferentes, ya sea una lista de ciudades, países, productos o documentos, siempre que los elementos de la lista implementen IAuthorizable
interfaz IAuthorizable
.
Tengo una solución similar para construir y, hasta ahora, he decidido usar especificaciones y roles, por lo que, de hecho, un rol tendría adjuntas algunas especificaciones de privilegios. Si todos están satisfechos, el permiso se concede; de lo contrario, vuelve al acceso predeterminado del recurso.
Estuve revisando para encontrar a alguien que ya estaba implementando la solución, pero parece que nadie lo hizo. Esperemos que no sea un fracaso :)