Использование нескольких избирателей из разных групп в Symfony2

Первоначально я создал избирателя в одном из моих пакетов и использовал его без проблем. Но я создал еще один в другом пакете, потому что он использует разные классы и способ, которым он будет решать, разрешать ли пользователям проходить, отличается.

Проблема в том, что этот второй избиратель не обнаружен, несмотря на то, что я выполнил те же самые шаги, что и для первого.

Что я делаю неправильно? Можно ли создать и использовать только одного избирателя?

Так что это первый, который работал правильно, я сделал это так, как написано в документации.

Зарегистрируйте это как услугу

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]