Пользователь Sonata - настроить административный запрос с безопасностью

Я расширил SonataUserBundle и хочу настроить запрос администратора, чтобы ограничить список:

class UserAdmin extends BaseUserAdmin
{
// ...
    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);
        $query->andWhere( 
            $query->expr()->eq($query->getRootAlias().'.company', ':comp')
        );
        $query->setParameter('comp', $securityContext->user->getCompany());
        return $query;
    }
// ...
}

Здесь я пытаюсь сделать так, чтобы пользователь видел только пользователей из своей компании.
Но $securityContext не задано.

Может ли кто-нибудь сказать, как внедрить контекст безопасности в мой класс администратора?


person Pierre de LESPINAY    schedule 04.07.2013    source источник


Ответы (2)


Вы должны внедрить службу контекста безопасности в службу UserAdmin.

Для этого вам нужно обновить services.yml вашего пакета:

services:
    # ...
    sonata.admin.user:
        class: My\ProjectBundle\Admin\UserAdmin
        tags:
            - {name: sonata.admin, manager_type: orm, group: users, label: users}
        arguments:
            - null
            - Application\Sonata\UserBundle\Entity\User
            - SonataAdminBundle:CRUD
            - @security.context #forth argument
        calls:
            - [setTranslationDomain, [MyProjectBundle]]
            - [setUserManager, [@fos_user.user_manager]]

В вашем классе UserAdmin переопределите конструктор:

namespace My\ProjectBundle\Admin;

class UserAdmin extends Admin
{

    private $securityContext = null;

    public function __construct($code, $class, $baseControllerName, $secutiryContext=null)
    {
        parent::__construct($code, $class, $baseControllerName);
        $this->securityContext = $securityContext;
    }

    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);
        $query->andWhere( 
            $query->expr()->eq($query->getRootAlias().'.company', ':comp')
        );
        $query->setParameter('comp', $this->securityContext->user->getCompany());
        return $query;
    }
}

Я не тестировал этот код, но я использую этот метод для внедрения service_container в администраторе сонаты для управления загрузкой файлов с помощью Gedmo Uploadable.

Надеюсь это поможет.

person Picoss    schedule 04.07.2013
comment
Хорошо, я вижу, но у меня нет службы, определенной в моем пакете. Если я поставлю один, он не будет интерпретирован. - person Pierre de LESPINAY; 04.07.2013
comment
Ну, это потому, что у вас должен быть вызов метода setUserManager в вашем определении службы. См. vendor/sonata-project/user-bundle/Sonata/UserBundle/Resurces/config/admin_orm.xml - person Picoss; 04.07.2013
comment
Да, я удалил свой 2-й комментарий. Итак, о моем первом, у вас есть ключ? - person Pierre de LESPINAY; 04.07.2013
comment
Вы должны загрузить свой config.yml, используя внедрение зависимостей. Проверьте файл My\ProjectBundle\DependencyInjection\MyProjectExtension symfony.com/doc/current/cookbook/bundles/ - person Picoss; 04.07.2013

Я знаю, что это очень старый вопрос, но как насчет;

$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

первым делом в public function createQuery($context = 'list') {

а затем в setParameter вы можете просто использовать $user->getCompany()

Так;

public function createQuery($context = 'list')
{
    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();

    $query = parent::createQuery($context);
    $query->andWhere( 
        $query->expr()->eq($query->getRootAlias().'.company', ':comp')
    );
    $query->setParameter('comp', $user->getCompany());
    return $query;
}
person Mentos93    schedule 24.08.2016