2016-02-22 2 views
1

Я использую два брандмауэры с одинаковым рисунком для двух типов пользователей:Несколько брандмауэров безопасности с той же схемой в 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 ролей?

+1

Не удивляйтесь, когда у вас есть все те же шаблоны, и первый совпаденный шаблон выигрывает. Это то же самое, что и маршруты. Ваш первый брандмауэр должен быть ограничен шаблоном: '^/admin', если не совпадать, а затем совпадение с брандмауэром, и пользователь будет перенаправлен на' user/login'. Приветствия. – malcolm

+0

Я могу сопоставить только ^/admin по причинам, объясняемым в вопросе. – martin

ответ

0

Вы можете вручную установить URL, где пользователь будет перенаправлен:

front: 
    pattern: .* 
    # ... 
    access_denied_url: /user/login 

Анонимные пользователи будут перенаправлены на ожидаемом пути входа в систему без необходимости определенного рисунка на брандмауэре.

Надеюсь, это решает вашу проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^