2013-04-09 8 views
5

私はFosUserBundleでSonataAdminBundleを使用しています。私はダッシュボードに少し問題があります。Sonata AdminロールとDDBBのアクセス許可からバンドルダッシュボードフィルタエンティティ

私のアプリケーションでは、リソース、企業、ユーザーがいます。ユーザーは会社に属し、自分の会社に所属するリソースも作成できます。このすべてのプロセスはダッシュボードで実行され、ダッシュボードはすべての役割からアクセス可能です。

私がやりたいことは、誰もがダッシュボードにアクセスできるということですが、ユーザーがダッシュボードに表示するエンティティ(リソース)を選択すると、その企業のエンティティだけが表示されます。たとえば、2つの企業が車両(リソース)を作成することができますが、各社は自分の車両(リソース)のみを表示します。

結論として、ダッシュボードは、接続されているユーザーの会社のエンティティをフィルタリングしたいと考えています。 ユーザーのCompany_IdとBBDDにマップされているリソースのCompany_Idに応じて、いくつかのエンティティのみを表示するようにSonataにクエリを作成する方法はありますか?

答えて

4

最も簡単な方法は、クエリを編集し、編集/表示アクションでアクセスをチェックすることです。このような

何か:

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

    /** @var \Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery @query */ 
    $query = $this->getModelManager()->createQuery($this->getClass(), 'o'); 
    if (!$this->isGranted('MASTER')) { 
     $query 
      ->where('entity.user = :user') 
      ->setParameter('user', $user) 
     ; 
    } 

    return $query; 
} 

ユーザーは、彼が唯一の彼自身のエンティティが表示されますマスターでない場合は

管理クラス。

また、adminクラスのhasSubjectAccess方法のように実装することができます:

/** 
* Check whether the user has access to the subject 
* 
* @return bool 
*/ 
protected function hasSubjectAccess() 
{ 
    $user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser(); 
    if (!$this->isGranted('MASTER') && $this->getSubject()->getUser() !== $user) { 
     return false; 
    } 

    return true; 
} 

をして編集し、ショー形式でチェックのこの種を行います

/** 
* {@inheritdoc} 
*/ 
protected function configureFormFields(FormMapper $formMapper) 
{ 
    if (!$this->hasSubjectAccess()) { 
     throw new AccessDeniedException(); 
    } 

    // ... 
} 

他の方法は、ACLを実装することです。あなたが最後にofficial documentation

+0

おかげで、それは私が探していたが、私はまだいくつかの疑問を持っているし。私はそれが長すぎたので新しい答えでそれらを書いた。 – Angel

1

でその詳細を読むことができ、私はこのようにそれを得る:

public function createQuery($context = 'list') 
    $query = $this->getModelManager()->createQuery($this->getClass(), 'entity'); 

    if (($this->getClass() instanceof \Sademer\CoreBundle\Entity\Resource) 
    || (is_subclass_of($this->getClass(), \Sademer\CoreBundle\Entity\Resource'))) 
    { 
      $query->select ('e'); 
      $query->from($this->getClass(), 'e'); 
      $query->from('CoreBundle\Entity\Resource', 'r'); 
      $query->where('e.id = r.id AND r.company = :company'); 
      $query->setParameter('company', 5); 
    } 
} 
1

私にとってからCreateQuery()関数は動作しませんでした。 Sonata Adminのバージョンが原因である可能性があります。とにかく、私のために働いたのはconfigureDatagridFilters()関数でした。

それはからCreateQueryと同じ仕事をしていませんし、このようなものになります。

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $qb = $datagridMapper 
     ->getDatagrid() 
     ->getQuery() 
     ->getQueryBuilder(); 

    $qb->andWhere(
     // Your where clause here 
    ); 
    $qb->setParameter(); // Set Parameter 
} 
関連する問題