2013-04-09 30 views
5

Tôi đang sử dụng SonataAdminBundle với FosUserBundle. Tôi có một chút vấn đề trong bảng điều khiển của tôi.Thực thể bộ lọc bảng điều khiển Sonata Admin Bundle từ vai trò và quyền DDBB

Trong đơn đăng ký của mình, tôi có tài nguyên, công ty và người dùng. Người dùng thuộc về một công ty và có thể tạo tài nguyên cũng thuộc về công ty của anh ấy. Tất cả các procces này sẽ được thực hiện trong bảng điều khiển, có thể truy cập được cho tất cả các vai trò.

Điều tôi muốn làm là mọi người có thể truy cập vào trang tổng quan nhưng khi người dùng chọn thực thể (tài nguyên) để liệt kê trong trang tổng quan, chỉ các thực thể của công ty của anh ta mới được hiển thị. Ví dụ, hai công ty có thể tạo ra một chiếc xe (tài nguyên), nhưng mỗi công ty sẽ chỉ thấy xe của mình (tài nguyên).

Kết luận, tôi muốn rằng Trang tổng quan lọc các thực thể của công ty của người dùng được kết nối. Có cách nào để tạo trong Sonata một truy vấn để chỉ hiển thị một số thực thể tùy thuộc vào Company_Id của người dùng và Company_Id của tài nguyên được ánh xạ trong BBDD không?

Trả lời

4

Cách dễ nhất là chỉnh sửa truy vấn và kiểm tra quyền truy cập trong các hành động chỉnh sửa/hiển thị.

Something như thế này:

quản lý lớp

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

Nếu người dùng không làm chủ ông sẽ chỉ nhìn thấy các đối tượng của riêng mình.

Bạn cũng có thể thực hiện hasSubjectAccess phương pháp của lớp quản trị như:

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

và thực hiện các loại kiểm tra trong chỉnh sửa và hiển thị các hình thức:

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

    // ... 
} 

Một cách khác là thực hiện ACL. Bạn có thể đọc thêm về điều đó trong official documentation

+0

Cảm ơn, đó là tôi tìm kiếm, nhưng tôi vẫn còn có một số nghi ngờ. Tôi đã viết chúng trong câu trả lời mới vì nó quá dài. – Angel

1

Cuối cùng, tôi nhận được nó như thế này:

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

Đối với tôi createQuery() chức năng không hoạt động. Có thể là do phiên bản quản trị Sonata. Dù sao, những gì làm việc cho tôi đã được configureDatagridFilters() chức năng.

Nó hiện công việc tương tự như createQuery và trông giống như sau:

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

    $qb->andWhere(
     // Your where clause here 
    ); 
    $qb->setParameter(); // Set Parameter 
} 
Các vấn đề liên quan