2013-12-17 3 views
0

Мы бежим в проекте, вроде выглядит так:Symfony2 Sonata Админ Bundle как «внешний интерфейс»

Клиенты могут войти в Пульт управления, в которой они могут редактировать информацию. Информация, которую они отредактировали, будет вытаскиваться через REST API другим программным обеспечением (это уже работает в предыдущей версии).

На самом деле база нашего приложения на самом деле такая же, как у SonataAdminBundle. Но, насколько я знаю, я не могу фильтровать данные просмотрены в SonataAdminBundle, с помощью которого пользователь вошел в систему

. Например:

  • User1, Пользователь2 и User3 являются сотрудниками из Клиент1. Им нужно только, чтобы увидеть данные, они все добавляемые customer1
  • Когда новый клиент Customer2 добавляется к системе некоторые пользователи также создал User10 и User11. Им нужно только, чтобы увидеть информацию о Customer2, а не информацию, добавленную customer1 (и наоборот)

Возможно ли это с помощью только SonataAdminBundle? Или нам нужно создать собственное программное обеспечение, которое сможет это сделать?

Я знаю, что мы должны создавать все разные отношения многоточия или onetomany, но это не проблема. Основной вопрос заключается в том, могу ли я фильтровать данные пользователем, который в настоящий момент зарегистрирован? И при регистрации в качестве администратора или супер администратора не должен применяться фильтр данных.

Заранее благодарен!

ответ

0

Да, можно использовать только SonataAdminBundle.

Прежде всего, пользователь получает доступ к данным из разных видов списка, поэтому вам необходимо переопределить метод createQuery вашего класса Admin, чтобы отобразить нужного Клиента.

(Не забудьте внедрить @ security.context службы)

public function createQuery($context = 'list') 
{ 
    $query = parent::createQuery($context); 

    if (!$this->isGranted('ROLE_SUPER_ADMIN') || !$this->isGranted('ROLE_ADMIN')) 
    { 
     $user = $this->securityContext->getToken()->getUser(); 

     $query-> 
      // your custom query. 
     ; 
    } 

    return $query; 
} 

Затем вам нужно securise все другие действия (просмотр, редактирование и удаление), чтобы запретить пользователю получить доступ к другим клиентам ,

Чтобы сделать это, я переопределяю действия своего контроллера и добавляю свою собственную логику перед вызовом родительского метода.

public function editAction($id = null) 
{ 
    // check if the user can access to the current customer 
    // if not throw new AccessDeniedException(); 

    return parent::editAction($id); 
} 

Возможно, есть более эффективные методы ..

+0

Но что-то не представляется возможным только через ACL,? Я нашел связку, которая, вероятно, делает то, что я хочу (https: // github.com/coopTilleuls/CoopTilleulsAclSonataAdminExtensionBundle) Но я думаю, что моя безопасность отсутствует, потому что я получаю только объекты на панели управления, когда обычный пользователь имеет роль: ROLE_ADMIN Когда у пользователя есть роль: ROLE_USER и ROLE_ [BUNDLENAME] _ [ENTITY] _ [GUEST/STAFF/EDITOR/ADMIN], тогда я думаю, что у меня должен быть доступ к просмотру списка сущностей, но я ничего не вижу. – Leroy

+0

Все пользователи должны иметь роли ROLE_ADMIN и ROLE_SONATA_ADMIN, иначе они не смогут использовать сонату. Невозможно ограничить доступ к определенной записи ролью или acl, вы можете устанавливать разрешения только для всей сущности. – rpg600

Смежные вопросы