Deseo crear un esquema para una ACL; sin embargo, estoy dividido entre un par de formas de implementarlo.Esquema de la base de datos para la ACL
Estoy bastante seguro de que no quiero lidiar con los permisos en cascada ya que eso genera mucha confusión en el servidor y para los administradores del sitio.
Creo que también puedo vivir con usuarios que solo cumplen una función a la vez. Una configuración como esta permitirá que los roles y permisos se agreguen según sea necesario a medida que el sitio crece sin afectar los roles/reglas existentes.
Al principio iba a normalizar los datos y tener tres tablas para representar las relaciones.
ROLES { id, name }
RESOURCES { id, name }
PERMISSIONS { id, role_id, resource_id }
una consulta para averiguar si un usuario se le permitió algún lugar se vería así:
SELECT id FROM resources WHERE name = ?
SELECT * FROM permissions WHERE role_id = ? AND resource_id = ? ($user_role_id, $resource->id)
Entonces me di cuenta de que sólo tendrá alrededor de 20 recursos, cada uno con hasta 5 acciones (crear , actualizar, ver, etc.) y tal vez otros 8 roles. Esto significa que puedo ejercer un flagrante desprecio por la normalización de datos ya que nunca tendré más de un par de cientos de registros posibles.
Entonces, tal vez un esquema como este tenga más sentido.
ROLES { id, name }
PERMISSIONS { id, role_id, resource_name }
que me permitiría para buscar registros en una sola consulta
SELECT * FROM permissions WHERE role_id = ? AND permission = ? ($user_role_id, 'post.update')
Entonces, ¿cuál de ellos es más correcto? ¿Hay otros diseños de esquema para ACL?
Puede buscar permisos en una sola consulta con el esquema correcto, correcto y normalizado también. Use un 'JOIN'. –
Mi experiencia directa con los permisos en cascada es que fue difícil para mí (el desarrollador/mantenedor del software) hacer las cosas bien, pero la vida fue mucho mejor para los administradores. En parte porque incluí en la UI de permiso la capacidad de ver lo que tenía permiso para hacer y * por qué * tenía permiso para hacerlo. Para que pudieran ver fácilmente de dónde provenía el permiso. Esto fue bastante intuitivo para ellos. – btilly