2012-01-25 3 views
3

У меня есть проблема с ACL,:Symfony2: ACL, роль и ClassScope

я использую рамки класса для предоставления разрешений на роли.

Это мой код, чтобы объявить ClassAce:

$objectIdentity = new \Symfony\Component\Security\Acl\Domain\ObjectIdentity('class', 'Complete\\Class\\Name'); 
try 
{ 
    $acl = $aclProvider->findAcl($objectIdentity); 
} 
catch (\Symfony\Component\Security\Acl\Exception\Exception $e) 
{ 
    $acl = $aclProvider->createAcl($objectIdentity); 
} 
// retrieving the security identity of the currently role 
$securityIdentity = new \Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity($role); 
// grant owner access 
$acl->insertClassAce($securityIdentity, \Symfony\Component\Security\Acl\Permission\MaskBuilder::MASK_OWNER); 
$aclProvider->updateAcl($acl); 

И это мой код, чтобы проверить доступ:

$securityContext = $this->get('security.context'); 
$oid = new \Symfony\Component\Security\Acl\Domain\ObjectIdentity('class', 'Complete\\Class\\Name'); 
if (false === $securityContext->isGranted('EDIT', $oid)) 
{ 
    throw new \Symfony\Component\Security\Core\Exception\AccessDeniedException(); 
} 

я получаю AccessDeniedExeption, с сообщением в журналах: «Нет ACL найден для идентификации объекта. Голосование, чтобы запретить доступ. "

я могу решить эту проблему путем изменения функции Равных в

исходной функции RoleSecurityIdentity является

public function equals(SecurityIdentityInterface $sid) 
{ 
    if (!$sid instanceof RoleSecurityIdentity) { 
     return false; 
    } 

    return $this->role === $sid->getRole(); 
} 

Но если я изменить его

public function equals(SecurityIdentityInterface $sid) 
{ 
    if (!$sid instanceof RoleSecurityIdentity) { 
     return false; 
    } 

    return $this->role == $sid->getRole(); 
} 

Он работает ...

Я использую свой собственный класс ролей, может ли это быть прообразом m?

Спасибо за ответы,

ответ

6

У меня была аналогичная проблема. Расширение Symfony \ Component \ Security \ Core \ Role \ Role в моем собственном ролевом классе решило проблему.

use Symfony\Component\Security\Core\Role\Role as CoreRole; 

class Role extends CoreRole{ // or extends CoreRole implements RoleInterface 
// my custom Role class 
} 

Узнайте, какие типы значений проверяются в равной функции, это должна быть строка, а не объект. В моем случае это был объект роли.

+0

Привет @anithaly - это класс ролей класса сущности doctrine? Я имею в виду, что вы сохраняете свои роли в своей базе данных? У меня такая же проблема, но я все равно попытаюсь сохранить свои роли в базе данных, но я буду абрикован, если вы можете мне помочь. – metalvarez

+0

Я думаю, что нашел ответ на свой вопрос, в документации по symfony объясняется, как сохранять роли в базе данных, а также объясняет, что вам нужно расширить Symfony \ Component \ Security \ Core \ Role \ Role, вот ссылка [Управление ролями в базе данных] (http://symfony.com/doc/current/cookbook/security/entity_provider.html#managing-roles-in-the-database) – metalvarez

Смежные вопросы