2013-04-09 32 views
5

Używam SonataAdminBundle z FosUserBundle. Mam trochę problemów na moim desce rozdzielczej.Pakiet admina Sonata Pakiet elementów panelu kontrolnego z roli i uprawnień DDBB

W mojej aplikacji mam zasoby, firmy i użytkowników. Użytkownik należy do firmy i może tworzyć zasoby, które będą należeć do jego firmy. Wszystkie te procesy zostaną wykonane w panelu, który jest dostępny dla wszystkich ról.

To, co próbuję zrobić, to to, że każdy może uzyskać dostęp do deski rozdzielczej, ale gdy użytkownik wybierze jednostkę (zasób) do wyświetlenia w panelu, zostaną wyświetlone tylko podmioty jego firm. Na przykład dwie firmy mogą stworzyć pojazd (zasoby), ale każda firma zobaczy tylko własne pojazdy (zasoby).

Podsumowując, chcę, aby panel kontrolny filtrował podmioty firmy użytkownika, który jest podłączony. Czy istnieje sposób utworzenia w sonacie zapytania pokazującego tylko niektóre podmioty w zależności od Company_ID użytkownika i Company_Id zasobu mapowanego w BBDD?

Odpowiedz

4

Najprostszym sposobem jest edycja zapytania i sprawdzenie dostępu w działaniach edycji/pokazu.

coś takiego:

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

Jeśli użytkownik nie jest panem będzie widział tylko jego własne podmiotów.

Można również wdrożyć hasSubjectAccess metodę klasy administratora, takich jak:

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

i wykonywanie tego rodzaju odprawy edycyjnych i występów formach:

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

    // ... 
} 

Innym sposobem jest wprowadzenie ACL. Możesz przeczytać więcej na ten temat w official documentation

+0

Dzięki, to ja szukałem, ale nadal mam pewne wątpliwości. Napisałem je w nowej odpowiedzi, ponieważ było to zbyt długie. – Angel

1

Wreszcie mogę to tak:

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

Dla mnie funkcja createQuery() nie działa. Może być z powodu wersji Sonata Admin. W każdym razie, dla mnie działała funkcja configureDatagridFilters().

Czyni to samo zadanie jak createQuery i wygląda mniej więcej tak:

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

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