2

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、設定されていません。

セキュリティ コンテキストを管理者クラスに挿入する方法を教えてもらえますか?

4

2 に答える 2

7

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;
    }
}

このコードはテストしませんでしたが、このメソッドを使用して、sonata admin に service_container を挿入し、Gedmo Uploadable を使用してファイルのアップロードを管理します。

お役に立てれば。

于 2013-07-04T10:19:09.403 に答える
1

これは非常に古い質問であることは知っていますが、どうでしょうか。

$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;
}
于 2016-08-24T12:34:04.053 に答える