Symfony2 Управление разрешениями пользователей

Я пришел к вам, потому что меня немного беспокоит управление пользователями и их разрешениями в Symfony2.

Позволь мне объяснить:

Я установил FOSUserBundle:

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

ROLE_GUEST -  VIEW,RATE
ROLE_USER  -  VIEW,CREATE,RATE,EDIT_OWN
ROLE_EDITOR - VIEW,CREATE,RATE,EDIT,DELETE  

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

Спасибо :)


person Jijo Joseph    schedule 28.06.2016    source источник


Ответы (1)


Если я правильно понимаю вашу потребность, вы хотите иметь уровень безопасности, основанный на этих ролях. Вы можете сделать это разными способами:

Способ Symfony по умолчанию — вы можете настроить уровень безопасности Symfony, как в примере ниже.

# app/config/security.yml
security:
# ...
access_control:
    - { path: ^/post/view, roles: VIEW }
    - { path: ^/post/rate, roles: RATE }
# etc

Это позаботится об управлении доступом к маршруту. Дополнительная информация на http://symfony.com/doc/current/cookbook/security/access_control.html

Для более сложных ролей, таких как EDIT_OWN, вы можете использовать прямой подход.

if (!$post->isAuthor($this->getUser())) {
    $this->denyAccessUnlessGranted('EDIT', $post);

    // or without the shortcut:
    //
    // use Symfony\Component\Security\Core\Exception\AccessDeniedException;
    // ...
    //
    // if (!$this->get('security.authorization_checker')->isGranted('edit', $post)) {
    //    throw $this->createAccessDeniedException();
    // }
} else {
    $this->denyAccessUnlessGranted('EDIT_OWN', $post);
}

Все это и многое другое вы можете найти на сайте Symfony http://symfony.com/doc/current/best_practices/security.html

Чтобы узнать о более сложных ролях или требованиях к ACL, также загляните сюда https://symfony.com/doc/current/components/security/authorization.html и авторизационные избиратели https://symfony.com/doc/current/components/security/authorization.html#voters

В 4 ссылках, которые я предоставил в этом посте, вы найдете все, что вам нужно для реализации RBAC, а также ACL. Вы также можете найти информацию о некоторых аннотациях, которые вы, возможно, захотите использовать. Также есть некоторые расширения уровня безопасности Symfony, которые могут пригодиться в зависимости от версии Symfony, над которой вы работаете, например, JMS\SecurityExtraBundle.

Надеюсь, эта помощь,

Александру Косой

person Alexandru Cosoi    schedule 28.06.2016
comment
Для конкретных вещей, таких как редактирование, но не удаление одного и того же объекта, не лучше ли использовать Избирателям проверить разрешение? - person Bart Bartoman; 28.06.2016
comment
@Bart Bartoman Все зависит от архитектуры вашего приложения. Вы можете ограничить действие в различных местах вашего приложения. Все зависит от сложности и информации, необходимой для того, чтобы решить, разрешено действие или нет. Итак, если, скажем, вы разрабатываете rest API, вы можете сократить доступ, начиная с уровня маршрутизации на основе ролей, но если вам нужны материалы ACL, вам нужно сначала получить объекты данных, которые контролирует ACL, и поэтому в этом случае избиратели может быть способ сделать это. Вот почему я просто упомянул избирателей в конце на случай, если ему потребуются более сложные правила ограничения. - person Alexandru Cosoi; 28.06.2016
comment
В конце концов, для оптимизации лучше всего ограничить доступ, как только вы точно узнаете, что он ограничен. На практике я использовал избирателей только тогда, когда я хотел ограничить вещи низкого уровня со сложными правилами ограничения, такими как редактирование свойства объекта. Но вы можете легко распространить информацию на избирателей из прямого доступа, если это необходимо. - person Alexandru Cosoi; 28.06.2016
comment
@Bart Bartoman Также вы должны стараться, чтобы функциональные возможности вашего приложения были как можно более простыми, чтобы поддерживать низкую энтропию вашего приложения. Таким образом, вместо того, чтобы задавать сложный вопрос, например: может ли пользователь редактировать, но не удалять, вы можете спросить, может ли пользователь редактировать. когда он пытается редактировать, и если использование может удалить, когда он пытается удалить. так что вы можете сократить сложный вопрос до 2 менее сложных вопросов. - person Alexandru Cosoi; 28.06.2016