Соната Admin ACL скрыть элемент в списке

После долгих усилий я наконец смог настроить Sonata Admin с ACL, следуя этому руководству:

https://sonata-project.org/bundles/admin/master/doc/reference/security.html

Я хотел, чтобы пользователи могли просматривать и редактировать только элементы с одинаковыми country собственность как пользователь.

Это мой config.yml:

parameters:
locale: en
sonata.user.admin.user.class: AppBundle\Admin\UserAdmin
sonata.admin.security.mask.builder.class: Sonata\AdminBundle\Security\Acl\Permission\MaskBuilder

# SonataAdminBundle Configuration
sonata_admin:
security:
handler: sonata.admin.security.handler.acl

role_admin: ROLE_ADMIN
role_super_admin: ROLE_SUPER_ADMIN

# acl security information
information:
GUEST:    [VIEW, LIST]
STAFF:    [EDIT, LIST, CREATE]
EDITOR:   [OPERATOR, EXPORT]
ADMIN:    [MASTER]

# permissions not related to an object instance and also to be available when objects do not exist
# the DELETE admin permission means the user is allowed to batch delete objects
admin_permissions: [CREATE, LIST, DELETE, UNDELETE, EXPORT, OPERATOR, MASTER]

# permission related to the objects
object_permissions: [VIEW, EDIT, DELETE, UNDELETE, OPERATOR, MASTER, OWNER]

Я создал AclVoter, чтобы показать / скрыть элементы:

services:
security.acl.voter.country_owned_permissions:
class: AppBundle\Security\Authorization\Voter\CountryOwnedAclVoter
arguments:
- "@security.acl.provider"- "@security.acl.object_identity_retrieval_strategy"- "@security.acl.security_identity_retrieval_strategy"- "@security.acl.permission.map"- "@logger"tags:
- { name: monolog.logger, channel: security }
- { name: security.voter, priority: 255 }
public: false

Это фактический класс:

<?php

namespace AppBundle\Security\Authorization\Voter;

use FOS\UserBundle\Model\UserInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Acl\Voter\AclVoter;

class CountryOwnedAclVoter extends AclVoter
{
public function supportsClass($class)
{
// support the Class-Scope ACL for votes with the custom permission map
// return $class === 'Sonata\UserBundle\Admin\Entity\UserAdmin' || is_subclass_of($class, 'FOS\UserBundle\Model\UserInterface');
// if you use php >=5.3.7 you can check the inheritance with is_a($class, 'Sonata\UserBundle\Admin\Entity\UserAdmin');
// support the Object-Scope ACL
return is_subclass_of($class, 'AppBundle\Model\CountryOwnedInterface');
}

public function supportsAttribute($attribute)
{
return in_array($attribute, array(
'LIST',
'VIEW',
'EDIT',
'DELETE',
'EXPORT',
));
}

public function vote(TokenInterface $token, $object, array $attributes)
{
if (!$this->supportsClass(get_class($object))) {
return self::ACCESS_ABSTAIN;
}

foreach ($attributes as $attribute) {
if ($this->supportsAttribute($attribute)) {
if ($object->getCountry() != $token->getUser()->getCountry()) {
//if ($object->isSuperAdmin() && !$token->getUser()->isSuperAdmin()) {
// deny a non super admin user to edit a super admin user
return self::ACCESS_DENIED;
}
}
}

// use the parent vote with the custom permission map:
// return parent::vote($token, $object, $attributes);
// otherwise leave the permission voting to the AclVoter that is using the default permission map
return self::ACCESS_ABSTAIN;
}
}

Кажется, это работает нормально, так как пользователь может редактировать только те элементы, которые имеют ту же страну, что и пользователи. Проблема в том, что он все еще может Посмотреть предметы в списке.

Что я делаю неправильно?

введите описание изображения здесь

0

Решение

Как указано в официальной документации, мне просто нужно было установить конкретный комплект:

5.4.6. СПИСОК ФИЛЬТРОВ
Фильтрация списков с использованием ACL доступна в виде стороннего пакета: CoopTilleulsAclSonataAdminExtensionBundle. Когда включено,
вошедший в систему пользователь увидит только те объекты, для которых у него есть ВИД
правильно (или выше).

Этого будет достаточно:

composer require tilleuls/acl-sonata-admin-extension-bundle

В AppKernel.php:

// ACL list filter
new CoopTilleuls\Bundle\AclSonataAdminExtensionBundle\CoopTilleulsAclSonataAdminExtensionBundle(),
0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector