2013-04-09 24 views
5

SonataAdminBundle, FosUserBundle ile kullanıyorum. Kontrol panelimde biraz sorunum var.Sonata Yönetici Konsolu gösterge tablosu filtresi varlıkları ve DDBB izinleri

Uygulamamda kaynak, şirket ve kullanıcı var. Bir kullanıcı bir şirkete aittir ve şirketine ait olan kaynakları da oluşturabilir. Tüm bu işlemler, tüm roller için erişilebilir olan panoda yapılacaktır.

Yapmaya çalıştığım şey, herkesin gösterge panosuna erişebildiği, ancak bir kullanıcı gösterge tablosunda listelenecek bir varlık (kaynak) seçtiğinde, yalnızca şirketlerinin varlıkları gösterilecektir. Örneğin, iki şirket bir araç (kaynak) oluşturabilir, ancak her şirket sadece kendi araçlarını (kaynaklarını) görecektir.

Sonuç olarak, Dashboard'un bağlı olan kullanıcının şirket varlıklarını filtreleyeceğini istiyorum. Sonata'da, kullanıcının Company_Id'sine ve BBDD'de eşlenen kaynağın Company_Id'sine bağlı olarak yalnızca bazı varlıkları gösterecek bir sorgu oluşturmanın bir yolu var mı?

cevap

4

En kolay yol, sorguyu düzenlemek ve düzenleme/gösterme eylemlerindeki erişimi denetlemektir. Böyle

şey:

/** 
* {@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; 
} 

kullanıcı sadece kendi varlıkları göreceksiniz MASTER değilse

Yönetici sınıfı.

Ayrıca benzeri yönetici sınıfının hasSubjectAccess yöntemi uygulayabilirsiniz:

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

ve düzenleme ve gösteri formlarının check bu tür gerçekleştirin:

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

    // ... 
} 

başka yolu ACL uygulamaktır. Sen Nihayet official documentation

+0

sayesinde, aradığım, ama hala bazı şüphelerim var. Onları yeni cevapta yazdım çünkü çok uzun sürdü. – Angel

1

yılında bu konuda daha fazla okuyabilir, böyle olsun:

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

Benim için createQuery() işlevi çalışmadı. Sonata Yöneticisi'nin sürümü nedeniyle olabilir. Her neyse, benim için çalışılan configureDatagridFilters() işleviydi.

O createQuery aynı işi yapar ve şöyle görünür:

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

    $qb->andWhere(
     // Your where clause here 
    ); 
    $qb->setParameter(); // Set Parameter 
} 
İlgili konular