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

Сначала я опишу грубо контекст. Я хочу иметь приложение 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 ответ

Решение

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

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

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

Другие вопросы по тегам