Где реализовать фильтр безопасности для динамических групп - PullRequest
2 голосов
/ 06 декабря 2010

Сначала я опишу грубо контекст.Я хочу иметь приложение Symfony, где я могу создавать различные области.В каждой из областей вы можете иметь разных типов пользователей (или ролей).Каждый пользователь может иметь несколько ролей в разных областях.

Чтобы проиллюстрировать вопрос, мы определим:

  • 2 области: «Область 1» и «Область 2».
  • 2 пользователя: «Пользователь 1» и «Пользователь 2».
  • 2 роли: «продавец» и «покупатель».
  • «Пользователь 1» - продавец и покупательв «Зоне 1»
  • «Пользователь 2» - продавец и покупатель в «Зоне 1» и покупатель только в «Зоне 2»

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

Подумав немного об этом, я сделалследующее:

  1. Когда создается область, я также создаю одну группу sfGuardGroup для каждой роли и одну глобальную группу sfGuardGroup для области, каждый из которых имеет суффикс с идентификатором области.Таким образом, в нашем примере мы будем иметь роли:
    • область-1, продавцы-1, покупатели-1 для области 1
    • область-2, продавцы-2, покупатели-2 дляобласть 2
  2. Пользователи добавлены в соответствующие группы.Итак, в нашем примере:
    • Пользователь 1 будет принадлежать к группам зона-1, продавцы-1 и покупатели-1
    • Пользователь 2 будет принадлежать к группам зона-1, продавцы-1,покупателей-1, области-2 и покупателей-2
  3. Из URL, я знаю, в какой области мы находимся, например:

В этот момент я застрял, потому что не могу найти лучшее место для реализациипроверка прав доступа: изменить защитный фильтр?Изменить действия?

1 Ответ

1 голос
/ 06 декабря 2010

Ваша необходимая реализация не поддерживается sfGuard, поэтому я бы порекомендовал создать новый дополнительный фильтр безопасности.

Вы можете создать новый фильтр, который расширяет sfFilter , а затем добавить его в filter.yml после существующего фильтра безопасности. Это означает, что все существующие функции безопасности, предоставляемые sfGuard, продолжаются.

Затем вы можете определить, какая область запрашивается, посмотрев на текущее имя модуля и имя действия (способ доступа к ним зависит от того, какую версию symfony вы используете, посмотрите в sfBasicSecurityFilter ключ), затем сравните это с ролями, которые текущий пользователь использует, используя sfGuardSecurityUser .

...