Чистое использование групп и ролей в FOSUserBundle

В настоящее время я работаю над проектом Symfony2. Он основан на Sonata и использует SonataUserBundle/FOSUserBundle для управления пользователями. Первоначальная разработка была сделана плохо, и я нахожусь в процессе рефакторинга многих из них.

Приложение определяет три уровня пользователей:

  • Администраторы
  • Консультанты
  • Предприятия

Они определяются как группы с FOSUserBundle, и к ним привязано множество ролей.

Теперь везде в коде предыдущие разработчики использовали (жестко закодировали) идентификаторы баз данных групп, чтобы сделать такие случаи:

$userGroup = $em->getRepository('ApplicationSonataUserBundle:Group')->findOneByName($group_name);
$userGroupId = $userGroup->getId();

if ($userGroupId == 1) {
   // Administrator case
   ...
} else if ($userGroupId == 7) {
   // Consultant case
   ...
}

Это явно очень плохо.

Моя проблема в том, что я уверен, как я могу реорганизовать это по-хорошему.
Я вижу три возможных способа сделать это:

  1. Работа напрямую с определенными ролями: ROLE_ADMIN, ROLE_CONSULTANT, ROLE_BUSINESS;

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

  3. Используйте многопользовательскую систему поверх FOSUserBundle. Я быстро просмотрел RollerworksMultiUserBundle и Многопользовательский пакет PUGX. Хотя я не знаю, не слишком ли это накладно, поскольку мои пользователи на самом деле делятся одной и той же информацией.

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


person Didier Ghys    schedule 29.07.2015    source источник


Ответы (1)


Мой совет — использовать роли напрямую и полностью отказаться от использования групп FOSUserBundle. В большинстве случаев они бесполезны. Группы — это концепция, унаследованная от sfGuardPlugin symfony1 в то время, когда иерархия ролей еще не была доступна в Symfony 2 (задолго до стабильной версии). В большинстве случаев иерархии ролей достаточно для удовлетворения потребности, усложняя группы без какой-либо пользы. И для нескольких других случаев я обнаружил, что использование избирателей, связанных с реальной бизнес-логикой проекта, более удобно в сопровождении, чем использование групп FOSUserBundle (думаю, я не использовал их ни в одном проекте с 4 лет).

Отказ от ответственности: я являюсь основным сопровождающим FOSUserBundle.

person Christophe Coevoet    schedule 22.12.2015
comment
Ну, это то, что я, наконец, сделал на самом деле. Было неуместно использовать группы FOSUserBundle, поскольку у нас была такая же иерархия, определенная с ролями Symfony. Я действительно узнал о избирателях, которые очень помогли мне легко настроить некоторые проверки с точки зрения бизнеса. Спасибо ! - person Didier Ghys; 04.01.2016