2016-02-23 2 views
5

Если у меня есть защищенный маршрут, скажем, как panel снизу, Symfony разрешит доступ только к зарегистрированным пользователям.Symfony security переадресовывает на страницу входа

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/panel, role: ROLE_USER } 

Для пользователей, которые не вошли в него всегда будет перенаправлять их на login_path (я использую FOSUserBundle):

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:  fos_user_security_login 

Где можно отключить или переопределить это перенаправление? Я хочу показать форму входа напрямую, не перенаправляя пользователя.

Я считаю, что это связано с AccessDeniedHandlerInterface, но какой ключ нужно перезаписать в security.yml? И где используется реализация по умолчанию?

Для других ситуаций у нас есть DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandler, и мы можем реализовать сервис для каждой из этих ситуаций, который расширяет их соответствующие интерфейсы и может обрабатывать ситуацию обычным образом. Тем не менее, ничего не могу найти для AccessDenied. Its directory содержит только интерфейс.

+2

В чем польза? После входа в систему пользователь будет перенаправлен обратно на/панель, и он не будет отличаться - что мне не хватает? – ccKep

+0

Я хочу добавить страницу входа на несколько маршрутов. Пользователь хочет получить доступ к странице, но он не зарегистрирован, поэтому я представляю ему регистрационную форму и после входа в систему (с помощью ajax) он перенаправляется на панель. –

+0

, чтобы показать форму входа, вы также должны разрешить анонимный доступ. Поэтому проверьте разрешение в контроллере, например – Heah

ответ

3

Я сделал бы это вручную.

Сделайте свой маршрут доступен анонимным:

- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] } 

В шаблоне, проверьте, есть ли зарегистрированный пользователь:

{% if app.user is null %} 
    <!-- Then display your login form --> 
{% else %} 
    <!-- Display the normal view --> 
{% endif %} 

Или это от контроллера:

if (!is_object($this->get('security.token_storage')->getToken()->getUser())) { 
    // Render the login form 
} 

Таким образом, вы можете сделать свою логику в зависимости от того, что пользователь аутентифицирован или нет.

+0

Учитывая, что пользователь хочет получить доступ к странице панели, и он перенаправляется на страницу, где я показываю форму входа (принятую и проверенную с помощью ajax), как узнать, какая страница перенаправляет пользователя после входа в систему (в этом случае страница) и как я узнаю, хочет ли пользователь сначала войти в систему или нет (форма входа - модальная, а контент извлекается с помощью ajax)? –

+0

В своем вопросе вы говорите, что не хотите перенаправлять пользователя, только отображаете форму входа. Чтобы узнать, на какой странице пользователь пытается получить доступ, используйте 'app.request.headers.get ('referer')' из ветки или '$ this-> getRequest() -> headers-> get ('referer')' из контроллера , Затем, если вы хотите перенаправить референта после входа в систему, добавьте в поле формы '_target_path', заполните его с помощью восстановленного референта и выполните перенаправление в методе, который обрабатывает вашу форму (если ваша форма обрабатывается FOSUser,' _target_path 'будет автоматически использоваться). Я могу сделать быстрое редактирование, если вам нужен пример. – chalasr

+0

Хорошо, сделаю. –