Cómo usar los conceptos avanzados ACL

El objetivo de este capítulo es darte una descripción más detallada del sistema ACL, y también explicar algunas de las decisiones de diseño detrás de él.

Conceptos de diseño

La capacidad de la instancia del objeto seguridad de Symfony2 está basada en el concepto de una Lista de Control de Acceso. Cada instancia del objeto dominio tiene su propia ACL. La instancia de ACL contiene una detallada lista de las entradas de control de acceso (ACE) utilizada para tomar decisiones de acceso. El sistema ACL de Symfony2 se enfoca en dos objetivos principales:

  • proporcionar una manera eficiente de recuperar una gran cantidad de ACL/ACE para los objetos de tu dominio, y para modificarlos;
  • proporcionar una manera de facilitar las decisiones de si a una persona se le permite realizar una acción en un objeto del dominio o no.

Según lo indicado por el primer punto, una de las principales capacidades del sistema ACL de Symfony2 es una forma de alto rendimiento de recuperar las ACL/ACE. Esto es muy importante ya que cada ACL puede tener varias ACE, y heredar de otra ACL anterior en una forma de árbol. Por tanto, ningún ORM es forzoso, en su lugar la implementación predeterminada interacciona con tu conexión directamente usando el DBAL de Doctrine.

Identidades de objeto

El sistema ACL está disociado completamente de los objetos de tu dominio. Ni siquiera se tienen que almacenar en la misma base de datos, o en el mismo servidor. Para lograr esta disociación, en el sistema ACL los objetos son representados a través de objeto identidad objetos. Cada vez, que desees recuperar la ACL para un objeto dominio, el sistema ACL en primer lugar crea un objeto identidad de tu objeto dominio y, a continuación pasa esa identidad de objeto al proveedor de ACL para su posterior procesamiento.

Identidad de seguridad

Esto es análogo a la identidad de objeto, pero representa a un usuario o un rol en tu aplicación. Cada rol, o usuario tiene una identidad de seguridad propia.

Estructura de tablas en la base de datos

La implementación predeterminada usa cinco tablas de bases de datos enumeradas a continuación. Las tablas están ordenadas de menos filas a más filas en una aplicación típica:

  • acl_security_identities: Esta tabla registra todas las identidades de seguridad (SID) de que dispone ACE. La implementación predeterminada viene con dos identidades de seguridad: RoleSecurityIdentity, y UserSecurityIdentity
  • acl_classes: Esta tabla asigna los nombres de clase a un identificador único el cual puede hacer referencia a otras tablas.
  • acl_object_identities: Cada fila de esta tabla representa una única instancia del objeto dominio.
  • acl_object_identity_ancestors: Esta tabla te permite determinar todos los ancestros de una ACL en una manera muy eficiente.
  • acl_entries: Esta tabla contiene todas las ACE. Esta suele ser la tabla con más filas. Puede contener decenas de millones sin impactar el rendimiento significativamente.

Alcance de las entradas del control de acceso

Las entradas del control de acceso pueden tener diferente ámbito en el cual se aplican. En Symfony2, básicamente hay dos diferentes ámbitos:

  • Class-Scope: Estas entradas se aplican a todos los objetos con la misma clase.
  • Object-Scope: Este fue el único ámbito de aplicación usado en el capítulo anterior, y solamente aplica a un objeto específico.

A veces, encontraras la necesidad de aplicar una ACE sólo a un campo específico del objeto. Digamos que deseas que el ID sólo sea visto por un gestor, pero no por tu servicio al cliente. Para resolver este problema común, se añadieron dos subámbitos:

  • Class-Field-Scope: Estas entradas se aplican a todos los objetos con la misma clase, pero sólo a un campo específico de los objetos.
  • Object-Field-Scope: Estas entradas se aplican a un objeto específico, y sólo a un campo específico de ese objeto.

Decisiones de preautorización

Para las decisiones de preautorización, es decir, las decisiones antes de que se invoque al método o acción de seguridad, se usa el servicio AccessDecisionManager provisto. El AccessDecisionManager también se utiliza para tomar decisiones de autorización basadas en roles. Al igual que los roles, el sistema ACL añade varios nuevos atributos que se pueden utilizar para comprobar diferentes permisos.

Mapa de permisos incorporados

Atributo Significado previsto Máscara de Bits
VIEW Cuando le es permitido a alguien ver el objeto dominio. VIEW, EDIT, OPERATOR, MASTER u OWNER
EDIT Cuando le es permitido a alguien hacer cambios al objeto dominio. EDIT, OPERATOR, MASTER, u OWNER
CREATE Cuando a alguien se le permite crear el objeto dominio. CREATE, OPERATOR, MASTER, u OWNER
DELETE Cuando a alguien se le permite eliminar el objeto dominio. DELETE, OPERATOR, MASTER u OWNER
UNDELETE Cuando le es permitido a alguien restaurar un objeto dominio previamente eliminado. UNDELETE, OPERATOR, MASTER u OWNER
OPERATOR Cuando le es permitido a alguien realizar todas las acciones anteriores. OPERATOR, MASTER u OWNER
MASTER Cuando le es permitido a alguien realizar todas las acciones anteriores, y además tiene permitido conceder cualquiera de los permisos anteriores a otros. MASTER u OWNER
OWNER Cuando alguien es dueño del objeto dominio. Un propietario puede realizar cualquiera de las acciones anteriores y otorgar privilegios y permisos de propietario. OWNER

Atributos de permisos frente a máscaras de bits de permisos

Los atributos los utiliza el AccessDecisionManager, justo como los roles. A menudo, estos atributos en realidad representan un conjunto de enteros como máscaras de bits. Las máscaras de bits de enteros en cambio, las utiliza internamente el sistema ACL para almacenar de manera eficiente los permisos de los usuarios en la base de datos, y realizar comprobaciones de acceso usando las extremadamente rápidas operaciones de las máscaras de bits.

Extensibilidad

El mapa de permisos citado más arriba no es estático, y, teóricamente, lo podrías reemplazar a voluntad por completo. Sin embargo, debería abarcar la mayoría de los problemas que encuentres, y para interoperabilidad con otros paquetes, te animamos a que le adhieras el significado que tienes previsto para ellos.

Decisiones de postautorización

Las decisiones de postautorización se realizan después de haber invocado a un método seguro, y por lo general implican que el objeto dominio es devuelto por este método. Después de invocar a los proveedores también te permite modificar o filtrar el objeto dominio antes de devolverlo.

Debido a las limitaciones actuales del lenguaje PHP, no hay capacidad de postautorización integrada en el núcleo del componente seguridad. Sin embargo, hay un JMSSecurityExtraBundle experimental que añade estas capacidades. Consulta su documentación para más información sobre cómo se logra esto.

Proceso para conseguir decisiones de autorización

La clase ACL proporciona dos métodos para determinar si una identidad de seguridad tiene la máscara de bits necesaria, isGranted y isFieldGranted. Cuando la ACL recibe una petición de autorización a través de uno de estos métodos, delega esta petición a una implementación de PermissionGrantingStrategy. Esto te permite reemplazar la forma en que se tomen decisiones de acceso sin tener que modificar la clase ACL misma.

PermissionGrantingStrategy primero verifica todo su ámbito de aplicación ACE a objetos si no es aplicable, comprobará el ámbito de la clase ACL, si no es aplicable, entonces el proceso se repetirá con las ACE de la ACL padre. Si no existe la ACL padre, será lanzada una excepción.

Bifúrcame en GitHub