Использование нескольких избирателей из разных групп в 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

0 ответов

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