2013-04-09 8 views
5

Sto utilizzando SonataAdminBundle con FosUserBundle. Ho un po 'di problemi nella mia dashboard.Entità filtro dashboard pacchetto Sonata Admin dal ruolo e autorizzazioni DDBB

Nella mia applicazione, ho risorse, aziende e utenti. Un utente appartiene a un'azienda e può creare risorse che apparterranno alla sua azienda. Tutte queste operazioni verranno eseguite nella dashboard, che è accessibile a tutti i ruoli.

Quello che sto cercando di fare è che tutti possano accedere alla dashboard, ma quando un utente seleziona un'entità (risorsa) da elencare nella dashboard, verranno mostrate solo le entità delle sue società. Ad esempio, due società potrebbero creare un veicolo (risorsa), ma ciascuna società vedrà solo i propri veicoli (risorse).

Concludendo, voglio che il Dashboard filtri le entità della società dell'utente che è connesso. Esiste un modo per creare nella query Sonata una visualizzazione di alcune entità che dipendono dall'ID_azienda dell'utente e dall'ID_azienda della risorsa mappata nel BBDD?

risposta

4

Il modo più semplice è modificare la query e controllare l'accesso nelle azioni di modifica/visualizzazione.

Qualcosa di simile a questo:

classe Admin

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

Se l'utente non è padrone vedrà solo la propria entità.

È possibile anche implementare hasSubjectAccess il metodo della classe di amministrazione come:

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

e di eseguire questo tipo di check-in modificare e mostrare le forme:

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

    // ... 
} 

L'altro modo è quello di implementare ACL. Si può leggere di più su questo nel official documentation

+0

Grazie, sono stato io cercando, ma ho ancora qualche dubbio. Li ho scritti in una nuova risposta perché era troppo lungo. – Angel

1

Infine, ho capito in questo modo:

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

Per me la funzione createQuery() non ha funzionato. Può essere dovuto alla versione di Sonata Admin. Ad ogni modo, ciò che ha funzionato per me è stata la funzione configureDatagridFilters().

Lo fa lo stesso lavoro di createQuery e simile a questa:

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

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