Где реализовать фильтр безопасности для динамических групп
Сначала я опишу грубо контекст. Я хочу иметь приложение Symfony, где я могу создавать различные области. В каждой из областей вы можете иметь разных типов пользователей (или ролей). Каждый пользователь может иметь несколько ролей в разных областях.
Чтобы проиллюстрировать вопрос, мы определим:
- 2 зоны: "Зона 1" и "Зона 2".
- 2 пользователя: "Пользователь 1" и "Пользователь 2".
- 2 роли: "продавец" и "покупатель".
- "Пользователь 1" является продавцом и покупателем в "Зоне 1"
- "Пользователь 2" - продавец и покупатель в "Зоне 1", а покупатель только в "Зоне 2"
Мой вопрос: как лучше всего проверить на страницах с ограниченным доступом, принадлежит ли пользователь определенной области и имеет ли он необходимую роль в этой области.
Подумав немного об этом, я сделал следующее:
- Когда создается область, я также создаю одну группу sfGuardGroup для каждой роли и одну глобальную группу sfGuardGroup для области, каждая из которых имеет суффикс с идентификатором области. Итак, в нашем примере мы будем иметь следующие роли:
- площадь-1, продавцы-1, покупатели-1 для области 1
- площадь-2, продавцы-2, покупатели-2 на область 2
- Пользователи добавляются в соответствующие группы. Итак, в нашем примере:
- Пользователь 1 будет принадлежать к группам зона-1, продавцы-1 и покупатели-1
- Пользователь 2 будет принадлежать к группам зона-1, продавцы-1, покупатели-1, зона-2 и покупатели-2
- Из URL я знаю, в какой области мы находимся, например:
- http://example.com/area-1/sellers-restricted-page (доступно для пользователей в группе area-1 и sellers-1)
- http://example.com/area-2/buyers-restricted-page (доступно для пользователей в зоне группы-2 и покупателях-2)
- http://example.com/area-2/ (доступно пользователям в группе area-2)
В этот момент я застрял, потому что не могу найти лучшее место для реализации проверки прав: изменить защитный фильтр? Изменить действия?
1 ответ
Требуемая реализация не поддерживается sfGuard, поэтому я бы порекомендовал создать новый дополнительный фильтр безопасности.
Вы можете создать новый фильтр, который расширяет sfFilter, а затем добавить его в filter.yml после существующего фильтра безопасности. Это означает, что все существующие функции безопасности, предоставляемые sfGuard, продолжаются.
Затем вы можете определить, какая область запрашивается, посмотрев на текущее имя модуля и имя действия (как вы обращаетесь к ним, зависит от того, какую версию Symfony вы используете, посмотрите подсказку в sfBasicSecurityFilter), а затем сравните это с ролями, которые вы используете. текущий пользователь использует sfGuardSecurityUser.