symfony2 - acl

Download Symfony2 - ACL

If you can't read please download the document

Upload: gonzalo-alonso

Post on 19-Jun-2015

796 views

Category:

Technology


5 download

DESCRIPTION

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

TRANSCRIPT

  • 1. Symfony 2

2. ACL Access Control Lists Listas para el Control de AccesoGonzalo [email protected]@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 tambin implica un objeto dominio al cual seest solicitando acceso. Aqu es donde entra enjuego el sistema ACL. 4. EscenarioImagina que estas diseando un sistema de blog donde un usuario puede administrarlo y publicarsus propias entradas. En este escenario, Entrada sera nuestro objeto dominio al cualdeseas restringir el acceso. Podras tomar variosenfoques para lograr esto usando Symfony2, dos enfoques bsicos (no exhaustivos) son: 5. Reforzar la seguridad en los mtodos de tu negocio:Bsicamente, significa mantener una referenciadentro de cada comentario a todos los usuariosque tienen acceso, y luego comparar estosusuarios al Token provisto.Reforzar la seguridad con roles: En este enfoque, debes agregar un rol a cadaobjeto comentario, es decir,ROLE_COMMENT_1, ROLE_COMMENT_2, etc. 6. Tomar una decisinLos 2 mtodos 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 conexin al sistema ACL que se supone vas a usar:YAML# app/config/security.ymlsecurity:acl:connection: default 8. Generar estructura de la base dedatos:Despus de configurar la conexin, 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. Cdigo 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 objetosde dominio directamente, sino slo 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 grannmero de objetos sin tener que hidratar estosobjetos. 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 alusuario que ha iniciado sesin.MaskBuilder::MASK_OWNER es una mscara debits enteros predefinida; no te debe preocupar que el constructor de la mscara abstraiga lamayora de los detalles tcnicos, porque gracias aesta tcnica puedes almacenar muchos permisosdiferentes en la fila de la base de datos, lo cual teda un considerable impulso en rendimiento. 16. Comprobando el acceso:$securityContext = $this->get(security.context);// verifica el acceso para edicinif (false === $securityContext->isGranted(EDIT,$entrada)) {throw new AccessDeniedException(); }// recupera el objeto entrada, y realiza tu edicin 17. Permisos acumuladosEn el ejemplo, slo concediste al usuario elpermiso OWNER base. Si bien este ademspermite efectivamente al usuario realizarcualquier operacin, como ver, editar, etc., sobreel objeto dominio, hay casos en los que deseasconceder explcitamente estos permisos. 18. Crear mscaras con MaskBuilder$builder = new MaskBuilder();$builder->add(view)->add(edit)->add(delete)->add(undelete);$mask = $builder->get(); // int(29) 19. Utilizar mscara creadaEsta mscara de bits de enteros, se puede utilizar paraconceder a un usuario los permisos base aadidosanteriormente:$identity = new UserSecurityIdentity(david,AcmeUserBundleEntityUser);$acl->insertObjectAce($identity, $mask);El usuario ahora puede ver, editar, borrar, y recuperar objetoseliminados. 20. REFERENCIASDocumentacin Symfony2http://symfony.com/doc/current/cookbook/security/acl.html