2011-08-09 21 views
6

Empecé a aprender Symfony 2 este fin de semana. No tuve problemas, ya que el marco está bien documentado en mi opinión.FOSUserBundle y ACL Business Rol

Estoy usando el paquete FOSUserBundle para ACL. Me pregunto si es posible que sea similar al marco Yii:

$bizRule='return Yii::app()->user->id==$params["post"]->authID;'; 
$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule); 
$task->addChild('updatePost'); 

Usted puede ver todos los detalles en el fragmento anterior.

¿Cómo puedo lograr algo similar con Symfony 2? es posible?

+0

Si entiendo correctamente, ¿quiere poder restringir la edición/actualización de una publicación al autor de esa publicación? No estoy familiarizado con Yii, así que estoy dando una oportunidad en la oscuridad aquí. – Problematic

+0

@Problematic - Exactamente. El enfoque Yii ACL le permite proporcionar una regla comercial (como se muestra en el fragmento en mi pregunta). Comprueba automáticamente si el ID de usuario registrado es igual a authID (o cualquier otra columna) de la publicación que se selecciona de la base de datos). ¿Conoces la funcionalidad similar en Symfony 2? – users1184848

Respuesta

22

Symfony2 tiene un ACL system fuera de la caja que hará esto. Estoy incluyendo el código correspondiente en aras de la exhaustividad (modificado para Post en lugar de Comment como tal en la documentación):

public function addPostAction() 
{ 
    $post = new Post(); 

    // setup $form, and bind data 
    // ... 

    if ($form->isValid()) { 
     $entityManager = $this->get('doctrine.orm.default_entity_manager'); 
     $entityManager->persist($post); 
     $entityManager->flush(); 

     // creating the ACL 
     $aclProvider = $this->get('security.acl.provider'); 
     $objectIdentity = ObjectIdentity::fromDomainObject($post); 
     $acl = $aclProvider->createAcl($objectIdentity); 

     // retrieving the security identity of the currently logged-in user 
     $securityContext = $this->get('security.context'); 
     $user = $securityContext->getToken()->getUser(); 
     $securityIdentity = UserSecurityIdentity::fromAccount($user); 

     // grant owner access 
     $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
     $aclProvider->updateAcl($acl); 
    } 
} 

Esencialmente, usted está dando actualmente conectado en la propiedad del usuario de la entidad Post (que incluye permisos de edición). Y a continuación, para comprobar si el usuario actual tiene permiso para editar:

public function editPostAction(Post $post) 
{ 
    $securityContext = $this->get('security.context'); 

    // check for edit access 
    if (false === $securityContext->isGranted('EDIT', $post)) 
    { 
     throw new AccessDeniedException(); 
    } 

    // retrieve actual post object, and do your editing here 
    // ... 
} 

I altamente recomendamos que lea a través de ambos Access Control List y Advanced ACL Concepts las recetas de cocina para más información. La creación real de ACL como se muestra arriba es extremadamente detallada, y he estado trabajando en un open-source ACL manager para aliviar el dolor ... "funciona"; es una versión beta inicial y necesita mucho amor, por lo que debes utilizarla bajo tu propio riesgo.

+0

Gracias por responder. Todo está claro para mí ahora. – users1184848

+4

Si mi respuesta lo ha ayudado, puede votar y aceptarlo usando las flechas y la marca de verificación cerca de la parte superior de la respuesta. Gracias. – Problematic