Я использую два брандмауэры с одинаковым рисунком для двух типов пользователей:Несколько брандмауэров безопасности с той же схемой в Symfony2
- Администратор с доступом к внешнему и внутреннему, которые могут видеть некоторые дополнительные элементы управления во внешнем интерфейсе приложении затем обычный пользователь.
- Пользователь, который имеет доступ только к интерфейсу.
Это мой упрощенный security.yml
конфигурации:
firewalls:
admin:
pattern: .*
form_login:
login_path: /admin/login
check_path: /admin/login
logout:
path: /admin/logout
...
front:
pattern: .*
form_login:
login_path: /user/login
check_path: /user/login-check
logout: true
anonymous: true
...
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
access_control:
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/admin/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/profile, role: ROLE_FRONTEND_USER }
- { path: ^/user/upload-photo, role: ROLE_FRONTEND_USER }
...
Проблема заключается в том, что, когда любой пользователь не LoggedIn пытается получить доступ к примеру /user/profile
они перенаправляются на /admin/login
. Я предполагаю, что это связано с отсутствием связи между firewall
и access_control
, поэтому Symfony не может знать, попытался ли пользователь получить доступ к разделу для ROLE_FRONTEND_USER
или ROLE_ADMIN
, а затем перенаправлен соответствующим образом.
Мой вопрос в том, есть ли элегантный способ решить эту проблему? Может быть, использовать прослушиватель событий и вручную проверять запрещенные разрешения, нужен ли требуемый URL-адрес ROLE_FRONTEND_USER
или ROLE_ADMIN
ролей?
Не удивляйтесь, когда у вас есть все те же шаблоны, и первый совпаденный шаблон выигрывает. Это то же самое, что и маршруты. Ваш первый брандмауэр должен быть ограничен шаблоном: '^/admin', если не совпадать, а затем совпадение с брандмауэром, и пользователь будет перенаправлен на' user/login'. Приветствия. – malcolm
Я могу сопоставить только ^/admin по причинам, объясняемым в вопросе. – martin