Symfony 2 ACL e Role Hierarchy

Estou um pouco preso e incapaz de encontrar a resposta para isso.

No teste do meu aplicativo, criei dois Usuários de Entidades e o comentário ambos são mapeados corretamente.

Eu criei um pequeno controlador que, dependendo do usuário, adicionará o comentário e os dados às tabelas ACL , se eu criar meu comentário como um usuário padrão com o associado para ‘ROLE_USER’ e tente acessá-lo como usuário com o role ‘ROLE_ADMIN’ Eu recebo access negado, parece ignorar completamente a hierarquia security.yml.

Eu sei que isso funciona adicionando em vez do userid o ROLE_USER etc, mas eu não quero fazê-lo dessa maneira.

Exemplos do meu código estão abaixo.

CommentController

createForm(new commentType(), $comment); $form->handleRequest($request); if ($form->isValid()) { $comment->setUsers($this->getUser()); $em = $this->getDoctrine()->getManager(); $em->persist($comment); $em->flush(); // creating the ACL $aclProvider = $this->get('security.acl.provider'); $objectIdentity = ObjectIdentity::fromDomainObject($comment); $acl = $aclProvider->createAcl($objectIdentity); // retrieving the security identity of the currently logged-in user $securityIdentity = UserSecurityIdentity::fromAccount($this->getUser()); // grant owner access $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); $aclProvider->updateAcl($acl); } return array( 'form' => $form->createView(), ); } /** * @Route("/comment/{id}/", requirements={"id":"\d+"}) * @Template() */ public function editAction(Request $request,$id) { $em = $this->getDoctrine()->getManager(); $comment = $em->find('ACLTestBundle:Comment', $id); $securityContext = $this->get('security.context'); // check for edit access if (false === $securityContext->isGranted('EDIT',$comment)) { throw new AccessDeniedException(); } $form = $this->createForm(new commentType(), $comment); $form->handleRequest($request); if($form->isValid()){ $em->persist($comment); $em->flush(); } return array('form' => $form->createView()); } } 

security.yml

  security: encoders: ACL\TestBundle\Entity\User: plaintext acl: connection: default providers: database: entity: { class: ACLTestBundle:User } role_hierarchy: ROLE_ADMIN: [ROLE_USER, ROLE_ALLOWED_TO_SWITCH] firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: pattern: ^/ provider: database anonymous: true logout: true switch_user: true form_login: login_path: _security_login access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/, roles: IS_AUTHENTICATED_FULLY } 

Agradeço qualquer conselho!

O problema é que você está adicionando adicionar base ACL em UserIdentity e deseja verificar a base gran em RoleIdentity. Se você quiser fazê-lo, a base do papel altera a ACL de criação como abaixo

 // creating the ACL $aclProvider = $this->get('security.acl.provider'); $objectIdentity = ObjectIdentity::fromDomainObject($comment); $acl = $aclProvider->createAcl($objectIdentity); // retrieving the security identity of the currently logged-in user $securityIdentity = UserSecurityIdentity::fromAccount($this->getUser()); // grant owner access $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); // grant EDIT access to ROLE_ADMIN $securityIdentity = new RoleSecurityIdentity('ROLE_ADMIN'); $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_EDIT); $aclProvider->updateAcl($acl); 

Como você vê, eu mantive o access do proprietário para o usuário específico, então eu adicionei o access de edição para ROLE_ADMIN. Você pode manter o controlador como está.

Se você não deseja criar Base de function, mas apenas quer dar uma exceção para usuários de administração, você pode alterar seu controlador como

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