Symfony2: контроль доступа к ресурсам

Я работаю над приложением, где каждый пользователь может иметь доступ ко многим Projectи где каждый Project может содержать много Campaign(s) и так далее и тому подобное.
Тогда мои URL выглядят так:

/ Проект /{project}/ член

/ Проект /{project}/ Членом /{member}

/ Проект /{project}/ кампания

/ Проект /{project}/ Кампании /{campaign}

/ Проект /{project}/ Кампании /{campaign}/сюжет

/ Проект /{project}/ Кампании /{campaign}/сюжет/{plot}

Я прочитал это @ParamConverter может обрабатывать эти URL в соответствии с моими потребностями.

—Problem—

Я ищу способ, которым любой пользователь, имеющий доступ к проекту, имеет право … без копирования кода внутри каждого контроллера.
Один пользователь может быть привязан ко многим проектам, предоставленным с (ROLE_MEMBER или же ROLE_ADMIN).

0

Решение

Я бы предложил сделать себя слушателем KernelEvents :: CONTROLLER в соответствии с http://symfony.com/doc/current/cookbook/service_container/event_listener.html

Ваш слушатель будет вызван после сопоставления маршрута с контроллером, но до вызова метода действия контроллера. В аргументе request будут установлены переменные вашего проекта / кампании и т. Д.

Затем я бы предложил разрешить этому слушателю загружаться в ваш проект и кампанию вместо использования param converter. Я просто думаю, что это будет немного чище. Все, что вам нужно сделать, это получить их, а затем сохранить их обратно в объект запроса. Затем они окажутся в вашем методе действия контроллера.

Получив свои объекты, вы можете использовать контекст безопасности для проверки ролей и просто выбросить исключение AccessDenied, если это необходимо.

Я бы на самом деле переместил проверку прав доступа одному или нескольким избирателям безопасности http://symfony.com/doc/current/cookbook/security/voters_data_permission.html .

Это даст вам более детальный контроль доступа, не прибегая к полному списку контроля доступа. Это также означает, что при необходимости вы можете выполнять проверку ролей в других местах, например, в шаблонах.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]