SYMFONY2: ACL, Role и ClassScope

У меня проблема с ACL:

Я использую область видимости для предоставления прав на роль.

Это мой код для объявления 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();
}

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

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам