Symfony 2 ACL против избирателей

Я хочу использовать isGranted('EDIT', $userObject) для разрешения редактирования заданных пользовательских данных всеми администраторами и менеджерами и этим одним пользователем.

Должен ли я использовать ACL для управления редактированием $userObject? Я написал дополнительный Voter, который проверяет, совпадают ли зарегистрированный пользователь и данный объект, или пользователь является менеджером или администратором.

В acl я должен добавить ACE для userObject для всех администраторов, менеджеров и этого одного пользователя.

Какой способ рекомендуется? Я новичок в Symfony..

ниже код избирателя:

function vote(TokenInterface $token, $object, array $attributes)
{
    $intersect=array_intersect(array('EDIT','VIEW' ), $attributes);
    if (!empty($intersect))
    {
        //intersect is not empty, it seems to edit or view are in $attributes
        //voter grants privileges for [user->granted object]
        //manager->every customer, child-manager
        //admin->every customer and manager
        if ($token->getUser()->isAdmin())
        {
            return VoterInterface::ACCESS_GRANTED;
        }
        elseif ($token->getUser()->isCustomer())
        {
            //voter not want to think about customer grants, because customer grants currently are held in ACL
            return VoterInterface::ACCESS_ABSTAIN;
        }
        /* @var $object \PSB\StoreBundle\Entity\Customer */
        if (is_a($object, '\PSB\StoreBundle\Entity\Customer'))
        {

            if ($token->getUser()->isManager())
            {
                //managers also edit customers
                return VoterInterface::ACCESS_GRANTED;
            }
        }
        elseif (is_a($object, '\PSB\StoreBundle\Entity\Manager'))
        {
            /* @var $object \PSB\StoreBundle\Entity\Manager */
            if ($token->getUser()->isManager())
            {
                //manager can edit own children
                if ($token->getUser() == $object->getParent())
                {
                    return VoterInterface::ACCESS_GRANTED;
                }
            }
        }
    }
    return VoterInterface::ACCESS_ABSTAIN;
}

person borovsky    schedule 08.01.2013    source источник


Ответы (1)


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

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

PS: вы должны использовать $object instanceof Class вместо is_a($object, 'Class')

person AdrienBrault    schedule 09.01.2013
comment
спасибо за совет instanceof: P кстати, как я могу передать класс в качестве аргумента? используйте \Мой\пакет\Класс; -- function_getting_class_param(Класс); - person borovsky; 11.01.2013
comment
Я знаю, что это старый SO, но, черт возьми, это все еще отличный и актуальный ответ. - person vpassapera; 20.12.2016