Для реализации доступа только к своим созданным сущностям в Sonata Admin вам потребуется использовать ролевую систему и фильтрацию данных.
Первым шагом вам нужно создать пользовательскую роль, которая будет иметь доступ только к своим сущностям. Для этого вы можете использовать механизм ролей, предоставляемый Symfony. Создайте новую роль, которая будет иметь доступ только к своим сущностям. Например:
// src/Security/Role/SelfEntityRole.php namespace AppSecurityRole; use SymfonyComponentSecurityCoreRoleRole; class SelfEntityRole extends Role { public function __construct() { parent::__construct('ROLE_SELF_ENTITY'); } }
Затем вам необходимо создать фильтр для административной панели Sonata Admin. В этом фильтре вы должны определить условия фильтрации, чтобы каждый пользователь видел только свои сущности. Например, вы можете определить фильтр на основе текущего пользователя:
// src/Admin/MyEntityAdmin.php namespace AppAdmin; use SonataAdminBundleAdminAbstractAdmin; use SonataAdminBundleDatagridListMapper; use SonataAdminBundleDatagridDatagridMapper; use SonataAdminBundleDatagridProxyQueryInterface; class MyEntityAdmin extends AbstractAdmin { protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('id') ->addIdentifier('name') ->addIdentifier('createdBy'); // Поле, которое указывает на пользователя, создавшего сущность } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('id') ->add('name') ->add('createdBy', null, [], null, ['property_path' => 'createdBy.id']); // Здесь указывается, что нужно фильтровать по ID пользователя } public function createQuery($context = 'list') { /** @var ProxyQueryInterface $query */ $query = parent::createQuery($context); $currentUser = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser(); $query->andWhere($query->getRootAliases()[0] . '.createdBy = :createdBy'); $query->setParameter('createdBy', $currentUser->getId()); return $query; } }
Теперь вам осталось настроить соответствующие права в вашем файле конфигурации безопасности security.yaml
. Назначьте только что созданную роль ROLE_SELF_ENTITY
соответствующему пользователю:
# config/packages/security.yaml security: role_hierarchy: ROLE_ADMIN: [ROLE_SELF_ENTITY]