2015-01-16 10 views
3

Вот мой security.yml для входа пользователя:Symfony2 Логин не use_referer работает

user_secured_area: 
     pattern: /* 
     anonymous: ~ 
     provider: user 
     form_login: 
      check_path: /login_check 
      login_path: /login 
      use_referer: true 
      username_parameter: _email 
     logout: 
      path: logout 
      target:/

Я проверил профилировщика для HTTP_REFERRER и я получил правильный реферер. Однако при входе в систему он перенаправляется на корневой URL, а не на URL-адрес реферирования. Любая идея об этом или я что-то пропустил?

Контроллер:

public function indexAction(Request $request){ 

    $session = $request->getSession(); 

    //get login error 
    if($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)){ 
     $error = $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR); 
    } 
    else if(null!==$session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)){ 
     $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR); 
     $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR); 
    } 
    else{ 
     $error = ""; 
    } 

    //repopulate username 
    $lastEmail = (null === $session) ? '' : $session->get(SecurityContextInterface::LAST_USERNAME); // a ? true : false 

    return $this->render('BazaarBundle:Login:login.html.twig', array('last_email' => $lastEmail, 'error' => $error)); 
} 

прутик:

<form action="{{ path('login_check') }}" method="post"> 
<label for="email">Email:</label> 
<input type="text" id="email" name="_email" value="{{ last_email }}" /> 

<label for="password">Password:</label> 
<input type="password" id="password" name="_password" /> 

<button type="submit">login</button> 
поведение

ответ

7

по умолчанию для перенаправления на испрашиваемого страницу после авторизации.

Опция use_referer используется только в том случае, если в сеансе не сохранено ни одного URL-адреса. В противном случае вы перенаправляетесь к целевому пути по умолчанию (который может быть определен с помощью опции default_target_path) или страницы по умолчанию ('/'), если параметры не определены.

Обратите внимание на атрибуты сеанса в отладчике Symfony (когда вы на странице входа). У вас есть запись _security.yourfirewall.target_path? Какая ценность?

EDIT: Кажется, что переменная сеанса определена только в том случае, если вы автоматически перенаправлены на страницу входа (например, при попытке получить доступ к защищенной области без необходимых прав).

Другая возможность - добавить скрытое поле с именем _target_path с требуемым значением (пример ниже).

Добавления target_path по форме (возможно, это должно быть хорошо, чтобы проверить, если он не пуст):

<input type="hidden" name="_target_path" value="{{ app.request.headers.get('referer') }}" /> 

Приветствие

+0

Он говорит, что «Сеанс не атрибуты», как я могу это сделать, когда в пользовательский логин, он будет перенаправлен обратно на свою предыдущую страницу, если он доступен? Нужно ли настраивать дополнительные сеансы для HTTP_REFERER? –

+0

Можете ли вы обновить свой вопрос с помощью шаблона формы входа и входа в систему? Простой вопрос, почему бы вам не использовать комплект, подобный FOSUserBundle? Это фантастический пакет и почти все, что связано с аутентификацией? – JonaPkr

+0

Я обновил свой вопрос, я не использую его, потому что у меня более сложное управление пользователями, мне нужны несколько страниц входа, таких как логин администратора, логин супердамина и логин пользователя с разными ролями. –

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