Your SlideShare is downloading. ×
Symfony2 - ACL
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Symfony2 - ACL

734
views

Published on

Como instalar, configurar, crear, agregar permisos y comprobar el acceso desde Symfony2 con Listas para el Control de Acceso.

Como instalar, configurar, crear, agregar permisos y comprobar el acceso desde Symfony2 con Listas para el Control de Acceso.

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
734
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
13
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Symfony 2
  • 2. ACL Access Control Lists Listas para el Control de AccesoGonzalo Alonsogonkpo@gmail.com @GonzaloAlonsoDhttp://groups.google.com/group/symfony-2-argentina
  • 3. ACLEn aplicaciones complejas, a menudo teenfrentas al problema de que las decisiones deacceso no se pueden basar únicamente en lapersona (Token) que está solicitando el acceso,sino también implica un objeto dominio al cual seestá solicitando acceso. Aquí es donde entra enjuego el sistema ACL.
  • 4. EscenarioImagina que estas diseñando un sistema de blog donde un usuario puede administrarlo y publicar sus propias entradas. En este escenario, Entrada sería nuestro objeto dominio al cualdeseas restringir el acceso. Podrías tomar varios enfoques para lograr esto usando Symfony2, dos enfoques básicos (no exhaustivos) son:
  • 5. Reforzar la seguridad en los métodos de tu  negocio:Básicamente, significa mantener una referenciadentro de cada comentario a todos los usuarios que tienen acceso, y luego comparar estos usuarios al Token provisto. Reforzar la seguridad con roles:  En este enfoque, debes agregar un rol a cada objeto comentario, es decir,ROLE_COMMENT_1, ROLE_COMMENT_2, etc.
  • 6. Tomar una decisiónLos 2 métodos nombrados anteriormente son validos, afortunadamente, hay una manera mejor, de la cual hablaremos ahora.
  • 7. Proceso de Arranque (bootstrapping): En primer lugar, tienes que configurar la conexión al sistema ACL que se supone vas a usar:YAML# app/config/security.ymlsecurity: acl: connection: default
  • 8. Generar estructura de la base de datos:Después de configurar la conexión, importamos la estructura de la base de datos. Afortunadamente, existe una tarea para eso. Basta con ejecutar la siguiente orden:$ php app/console init:acl
  • 9. Código completoif ($form->isValid()) { $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($entrada); $entityManager->flush(); $aclProvider = $this->get(security.acl.provider); $objectIdentity = ObjectIdentity::fromDomainObject($entrada); $acl = $aclProvider->createAcl($objectIdentity); $securityContext = $this->get(security.context); $user = $securityContext->getToken()->getUser(); $securityIdentity = UserSecurityIdentity::fromAccount($user); $acl->insertObjectAce($securityIdentity,MaskBuilder::MASK_OWNER); $aclProvider->updateAcl($acl); }
  • 10. Persistencia de datos:// debes persistir los datos en la bd$entityManager->persist($entrada);$entityManager->flush();
  • 11. Creando ACL:// creando la ACL$aclProvider = $this->get(security.acl.provider);$objectIdentity =ObjectIdentity::fromDomainObject($entrada);$acl = $aclProvider->createAcl($objectIdentity);
  • 12. En primer lugar ->createAcl() no acepta objetos de dominio directamente, sino sólo implementaciones de ObjectIdentityInterface. Este paso adicional te permite trabajar con ACL, incluso cuando no tienes a mano ningunainstancia real del objeto dominio. Será muy útil si deseas comprobar los permisos de un gran número de objetos sin tener que hidratar estos objetos.
  • 13. Recupero usuario logueado:// recupera la identidad de seguridad del usuario// registrado actualmente$securityContext = $this->get(security.context);$user = $securityContext->getToken()->getUser();$securityIdentity =UserSecurityIdentity::fromAccount($user);
  • 14. Otorgo los permisos:// otorga permiso de propietario$acl->insertObjectAce($securityIdentity,MaskBuilder::MASK_OWNER);$aclProvider->updateAcl($acl);
  • 15. La otra parte interesante es la llamada a ->insertObjectAce(). En el ejemplo, estasotorgando acceso de propietario al comentario al usuario que ha iniciado sesión.MaskBuilder::MASK_OWNER es una máscara de bits enteros predefinida; no te debe preocupar que el constructor de la máscara abstraiga lamayoría de los detalles técnicos, porque gracias aesta técnica puedes almacenar muchos permisosdiferentes en la fila de la base de datos, lo cual te da un considerable impulso en rendimiento.
  • 16. Comprobando el acceso:$securityContext = $this->get(security.context);// verifica el acceso para ediciónif (false === $securityContext->isGranted(EDIT,$entrada)) { throw new AccessDeniedException(); }// recupera el objeto entrada, y realiza tu edición
  • 17. Permisos acumuladosEn el ejemplo, sólo concediste al usuario elpermiso OWNER base. Si bien este ademáspermite efectivamente al usuario realizarcualquier operación, como ver, editar, etc., sobreel objeto dominio, hay casos en los que deseasconceder explícitamente estos permisos.
  • 18. Crear máscaras con MaskBuilder$builder = new MaskBuilder();$builder ->add(view) ->add(edit) ->add(delete) ->add(undelete);$mask = $builder->get(); // int(29)
  • 19. Utilizar máscara creadaEsta máscara de bits de enteros, se puede utilizar paraconceder a un usuario los permisos base añadidosanteriormente:$identity = new UserSecurityIdentity(david,AcmeUserBundleEntityUser);$acl->insertObjectAce($identity, $mask);El usuario ahora puede ver, editar, borrar, y recuperar objetoseliminados.
  • 20. REFERENCIASDocumentación Symfony2http://symfony.com/doc/current/cookbook/security/acl.html

×