2013-07-04 70 views
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

有人可以告訴如何將安全上下文注入我的管理類嗎?

回答

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管理文件上載。

希望這會有所幫助。

+0

好的,我明白了,但我沒有在我的包中定義任何服務。如果我放一個,它不會被解釋。 –

+0

嗯,這是因爲你必須調用服務定義中的setUserManager方法。請參閱vendor/sonata-project/user-bundle/Sonata/UserBundle/Resurces/config/admin_orm.xml – Picoss

+0

是的,我刪除了我的第二條評論。關於我的第一個問題,你有線索嗎? –

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