Первоначально я создал избирателя в одном из моих пакетов и использовал его без проблем. Но я создал еще один в другом пакете, потому что он использует разные классы и способ, которым он будет решать, разрешать ли пользователям проходить, отличается.
Проблема в том, что этот второй избиратель не обнаружен, несмотря на то, что я выполнил те же самые шаги, что и для первого.
Что я делаю неправильно? Можно ли создать и использовать только одного избирателя?
Так что это первый, который работал правильно, я сделал это так, как написано в документации.
Зарегистрируйте это как услугу
services:
security.access.support_voter:
class: SupportMessageBundle\Security\Voter\SupportVoter
public: false
tags:
- { name: security.voter }
Создать это. Краткое объяснение того, что он делает: проверяет роль текущего пользователя в отношении моего SupportMessageBundle
Пакет для поддержки билетов. У меня также есть константа, которая проверяет, был ли Билет запущен пользователем.
namespace SupportMessageBundle\Security\Voter;
use Symfony\Component\Security\Core\Authorization\Voter\AbstractVoter;
use MedAppBundle\Entity\User;
use Symfony\Component\Security\Core\User\UserInterface;
class SupportVoter extends AbstractVoter
{
const SUPPORT = 'support';
const SUPERADMIN = 'superadmin';
const MEDIC = 'medic';
const ISMINE = 'ismine';
/* const EDIT = 'edit';*/
protected function getSupportedAttributes()
{
return array(self::SUPPORT, self::SUPERADMIN,self::MEDIC,self::ISMINE/*, self::EDIT*/);
}
protected function getSupportedClasses()
{
return array('MedAppBundle\Entity\User','SupportMessageBundle\Entity\Ticket');
}
protected function isGranted($attribute, $object, $user = null)
{
// make sure there is a user object (i.e. that the user is logged in)
if (!$user instanceof UserInterface) {
return false;
}
// double-check that the User object is the expected entity.
// It always will be, unless there is some misconfiguration of the
// security system.
if (!$user instanceof User) {
throw new \LogicException('The user is somehow not our User class!');
}
switch ($attribute) {
case self::SUPPORT:
// the data object could have for example a method isPrivate()
// which checks the Boolean attribute $private
{
if ($user->hasRole('ROLE_SUPPORT')||$user->hasRole('ROLE_SUPER_ADMIN')) {
return true;
}
}
break;
case self::SUPERADMIN:
// the data object could have for example a method isPrivate()
// which checks the Boolean attribute $private
{
if ($user->hasRole('ROLE_SUPER_ADMIN')) {
return true;
}
}
break;
/*case self::EDIT:
// this assumes that the data object has a getOwner() method
// to get the entity of the user who owns this data object
if ($user->getId() === $post->getOwner()->getId()) {
return true;
}
break;*/
case self::MEDIC:
// the data object could have for example a method isPrivate()
// which checks the Boolean attribute $private
{
if ($user->hasRole('ROLE_MEDIC')) {
return true;
}
}
break;
case self::ISMINE:
// the data object could have for example a method isPrivate()
// which checks the Boolean attribute $private
{
if ($user == $object->getSender()) {
return true;
}
}
break;
}
return false;
}
}
Что касается второго,
Я регистрирую это как сервис, а также в другом пакете services.yml
:
services:
security.access.features_voter:
class: MedAppBundle\Security\Voter\FeaturesVoter
public: false
tags:
- { name: security.voter }
И на этот раз я ничего не проверяю, я просто возвращаюсь true
, но позвонив мне возвращается false
каждый раз, поэтому что-то явно не так.
namespace MedAppBundle\Security\Voter;
use Symfony\Component\Security\Core\Authorization\Voter\AbstractVoter;
class FeaturesVoter extends AbstractVoter
{
const ISMINE = 'ismine';
protected function getSupportedAttributes()
{
return array(self::ISMINE);
}
protected function getSupportedClasses()
{
return array('MedAppBundle/Entity/Features');
}
public function isGranted($attribute, $object, $user = null)
{
return true;
}
}
Вот как я пытался это назвать:
$this->isGranted('issmine',$id); //returns false
$this->denyAccessUnlessGranted('issmine', $id, 'Unauthorized access!'); //denies access
$id
это Feature
объект, и это от контроллера в MedAppBundle
который содержит Feature
Сущность.
Первый избиратель, однако, работает должным образом, поэтому я, должно быть, что-то не так делаю в заявлениях этого, иначе не может быть больше одного.
debug: контейнер не перечисляет их, даже рабочий. Пакеты загружаются в ядро, потому что я использую контроллеры и другие вещи от них, просто службы, похоже, не работают. Все комплекты имеют $loader->load('services.yml');
в каталоге DependencyInjection в файле BundlenameExtension.php
Задача ещё не решена.
Других решений пока нет …