2013-04-09 12 views
5

Ich verwende das SonataAdminBundle mit FosUserBundle. Ich habe ein paar Probleme in meinem Dashboard.Sonata Admin Bundle-Dashboard-Filterelement aus Rollen- und DDBB-Berechtigungen

In meiner Anwendung habe ich Ressourcen, Unternehmen und Benutzer. Ein Benutzer gehört zu einem Unternehmen und kann Ressourcen anlegen, die auch zu seinem Unternehmen gehören. All dies wird im Dashboard durchgeführt, das für alle Rollen zugänglich ist.

Was ich zu tun habe, ist, dass jeder auf das Dashboard zugreifen kann, aber wenn ein Benutzer eine Entität (Ressource) auswählt, die im Dashboard aufgelistet wird, werden nur die Entitäten seiner Firmen angezeigt. Zum Beispiel könnten zwei Unternehmen ein Fahrzeug (Ressource) erstellen, aber jedes Unternehmen sieht nur seine eigenen Fahrzeuge (Ressourcen).

Abschließend möchte ich, dass das Dashboard die Entitäten der Firma des Benutzers, der verbunden ist, filtern. Gibt es eine Möglichkeit, in der Sonate eine Abfrage zu erstellen, um nur einige Entitäten anzuzeigen, die von der Company_Id des Benutzers und der Company_Id der in der BBDD zugeordneten Ressource abhängen?

Antwort

4

Der einfachste Weg ist, die Abfrage zu bearbeiten und den Zugriff in Edit/Show Aktionen zu überprüfen.

Etwas wie folgt aus:

Admin Klasse

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

Wenn der Benutzer er nur nicht Herr wird, seine eigenen Einheiten sehen.

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

und führen Sie diese Art von Check-in bearbeiten und zeigen Formen:

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

    // ... 
} 

Der andere Weg ist ACL zu implementieren

Sie können auch hasSubjectAccess Methode der Admin-Klasse wie implementieren. Sie können schließlich in der official documentation

+0

Danke, es war ich suche, aber ich habe noch einige Zweifel. Ich schrieb sie in neuer Antwort, weil es zu lang war. – Angel

1

mehr darüber lesen, habe ich es so:

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

Für mich ist die Create() Funktion hat nicht funktioniert. Kann an der Version von Sonata Admin liegen. Wie auch immer, was für mich funktionierte, war die Funktion configureDatagridFilters().

Es macht die gleiche Arbeit wie Create und sieht etwa so aus:

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

    $qb->andWhere(
     // Your where clause here 
    ); 
    $qb->setParameter(); // Set Parameter 
} 
Verwandte Themen