Как реализовать доступ только к своим созданным сущностям в Sonata Admin?

Для реализации доступа только к своим созданным сущностям в 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]