2013-04-09 8 views
5

मैं सोसाटाएडमिनबंडल का उपयोग FOSUserBundle के साथ कर रहा हूं। मुझे अपने डैशबोर्ड में कुछ समस्याएं हैं Iसोनाटा एडमिन बंडल डैशबोर्ड फ़िल्टर इकाई भूमिका और डीडीबीबी अनुमतियों

मेरे आवेदन में, मेरे पास संसाधन, कंपनियां और उपयोगकर्ता हैं। एक उपयोगकर्ता एक कंपनी से संबंधित है, और संसाधन बना सकता है जो उसकी कंपनी से भी संबंधित होगा। ये सभी प्रोसेस डैशबोर्ड में किए जाएंगे, जो सभी भूमिकाओं के लिए सुलभ है।

मैं जो करने का प्रयास कर रहा हूं वह यह है कि हर कोई डैशबोर्ड तक पहुंच सकता है, लेकिन जब कोई उपयोगकर्ता डैशबोर्ड में सूचीबद्ध करने के लिए एक इकाई (संसाधन) का चयन करता है, तो केवल उसकी कंपनियों की इकाइयां दिखाई देंगी। उदाहरण के लिए, दो कंपनियां वाहन (संसाधन) बना सकती हैं, लेकिन प्रत्येक कंपनी केवल अपने वाहन (संसाधन) देखेगी।

निष्कर्ष निकालना, मैं चाहता हूं कि डैशबोर्ड कनेक्ट होने वाले उपयोगकर्ता की कंपनी की इकाइयों को फ़िल्टर करे। क्या सोनाटा में उपयोगकर्ता के कंपनी_आईडी और बीबीडीडी में मैप किए गए संसाधन के कंपनी_आईडी के आधार पर केवल कुछ इकाइयों को दिखाने के लिए कोई प्रश्न है?

उत्तर

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

उपयोगकर्ता को गुरु नहीं है, तो वह केवल अपने ही संस्थाओं देखेंगे।

तुम भी तरह व्यवस्थापक वर्ग के 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(); 
    } 

    // ... 
} 

अन्य तरीके से एसीएल लागू करने के लिए है। आप अंत में 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() फ़ंक्शन काम नहीं किया। सोनाटा व्यवस्थापक के संस्करण के कारण हो सकता है। वैसे भी, मेरे लिए क्या काम किया गया था DataagridFilters() फ़ंक्शन।

यह createQuery रूप में एक ही काम करता है और इस तरह दिखता है:

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

    $qb->andWhere(
     // Your where clause here 
    ); 
    $qb->setParameter(); // Set Parameter 
} 
संबंधित मुद्दे