symfony2 FOSUserBundle отсоединить роль от пользователя

У меня есть приложение, в котором пользователь может быть связан с несколькими компаниями. Связь manyToMany с компанией представляет собой выделенную сущность, называемую Associate.

Я хотел бы предоставить этому ассоциированному объекту ту же функциональность роли, что и мой объект FOSUserBundle User. Важно: если у пользователя есть role_manager для одной компании, ему не следует давать права доступа к определенным функциям другой компании, к которой он принадлежит.

Есть ли чистый способ сделать это? Например, я хотел бы проверить, верно ли значение $this->getUser->getAssociate->hasRole('ROLE_MANAGER').

Что, если я передам массив ролей моему ассоциированному объекту? Я читал, что это недостаточно безопасно? Почему? Что может сделать кто-то, чтобы нарушить эту безопасность, если моим пользователям все равно придется проходить проверки безопасности при входе в систему FOS?

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

РЕДАКТИРОВАТЬ: если существует лучшее решение, не связанное с ролями или с другой логикой, мне интересно узнать об этом!!


person Sébastien    schedule 08.12.2014    source источник
comment
У меня нет прямого ответа для вас. Но у меня есть некоторые идеи, как этого добиться. Моя первая мысль заключалась в том, чтобы использовать ROLE_ALLOWED_TO_SWITCH и создать собственный переключатель switchUserListener. Там вы помещаете свою логику, чтобы определить, кому разрешено переключаться на кого.   -  person Nico Kaag    schedule 09.12.2014
comment
Моя вторая идея основана на том факте, что роли — это просто строки. И его можно настроить на что угодно. Вам нужно будет сделать роли, которые вы проверяете, динамическими. Они будут выглядеть так: ROLE_MANAGER_COMPANY1. А в своем пользователе вы переопределяете метод getRoles, чтобы он генерировал все возможные роли, к которым у него может быть доступ.   -  person Nico Kaag    schedule 09.12.2014
comment
Хорошие мысли! На самом деле я нашел способ, который упрощает задачу, учитывая мои ограничения, см. мой следующий ответ.   -  person Sébastien    schedule 09.12.2014


Ответы (1)


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

Официальный документ предлагает использовать ACL, определяя роль для каждой компании или сохраняя данные в объекте. см. первые абзацы: http://symfony.com/doc/current/cookbook/security/acl.html

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

Смотрите моего избирателя здесь: вызов symfony2 is_granted в голосовании: как избежать бесконечного цикла?

person Sébastien    schedule 09.12.2014