2013-04-18 2 views
17

Say мой маршрут /booking/(.*) защищен конфигурации брандмауэра в security.yml и требует «ROLE_USER», когда пользователь пытается получить доступ любой маршрут, которому предшествует «/booking/», приложение перенаправляет пользователя на страницу входа для аутентификации.Как Symfony2 перенаправлять на запрашиваемую страницу после авторизации

Так что мой вопрос, после того, как пользователь вводит свои учетные данные и получает аутентификацию, то как Symfony 2 способен перенаправить пользователя обратно на страницу/маршрута пользователь просил для OR, где делает Symfony 2 магазина, что маршрут делает это хранить его в какой-то сессии или где-то еще.

Можем ли мы получить к нему доступ и как?

ответ

24

Это возможно, и вы можете получить доступ к ссылающаяся ссылке (который используется, если use_referer установлен в true) в сессии.

Например, если у вас есть success_handler сервис на вашем form_login (в конфигурации брандмауэра), который перенаправляет пользователей на основе некоторых критериев (обычно ролей), но вы хотите, чтобы перенаправить пользователя на ссылку ссылающейся , если он был установлен вы можете получить доступ к ссылке реферера следующим образом:

$key = '_security.main.target_path'; #where "main" is your firewall name 

//check if the referrer session key has been set 
if ($this->container->get('session')->has($key)) { 
    //set the url based on the link they were trying to access before being authenticated 
    $url = $this->container->get('session')->get($key); 

    //remove the session key 
    $this->container->get('session')->remove($key); 
} 
//if the referrer key was never set, redirect to a default route 
else{ 
    $url = $this->router->generate('member_home'); 
} 

return new RedirectResponse($url); 

Используя заголовок, чтобы получить реферера (т.е. $request->headers->get('referer')) не будет работать в этом случае, потому что он всегда будет возвращать ссылку для входа.

Благодаря римской Marintsenko & Райан Уивер для решения этого blog

+0

У вас есть какие-либо советы по этому делу? Здесь нам нужен реферер реферера ... –

+0

@aminejallouli, вам, вероятно, будет лучше хранить эту информацию где-нибудь (т.е. сеанс) и получить доступ к ней, когда она вам понадобится. –

+0

Вот как я это сделал! Он работает сейчас! :) Спасибо –

3

Symfony использует HTTP Referer header для перенаправления пользователя на страницу они пришли .. т.е. реферера

Вы можете установить это, используя конфигурацию безопасности use_referer: true в security.yml, details here

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

$referer = $request->headers->get('referer'); 

Не е заголовок мисс-пишется, его реферер (один г)

+1

Спасибо за ответ, но то, что мне нужно, немного другое. После небольшого поиска я нашел ответ на свой вопрос http://knplabs.com/blog/redirect-after-registration-in-symfony2 – Arif

10

Carrie Кендалла работал, спасибо!

Вот полная реализация в Symfony:

services.yml:

login_handler: 
    class: Project\BaseBundle\Service\loginHandler 
    arguments: ['@router', '@doctrine.orm.entity_manager', '@service_container'] 

и в Project \ BaseBundle \ Service \ loginHandler:

namespace Project\BaseBundle\Service; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 
use Symfony\Component\Routing\RouterInterface; 
use Doctrine\ORM\EntityManager; 


class loginHandler implements AuthenticationSuccessHandlerInterface { 

    private $router; 
    private $container; 
    private static $key; 

    public function __construct(RouterInterface $router, EntityManager $em, $container) { 

     self::$key = '_security.secured_area.target_path'; 

     $this->router = $router; 
     $this->em = $em; 
     $this->session = $container->get('session'); 

    } 

    public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 

     $user_entity = $token->getUser(); 

     if(!$user_entity->getChangePassword()) { 

      $route = $this->router->generate('BaseBundle_home_page'); 

     } else { 

      $this->session->getFlashBag()->add('error', 'Your password must be changed now'); 

      $route = $this->router->generate('BaseBundle_account_page'); 

     } 

     //check if the referer session key has been set 
     if ($this->session->has(self::$key)) { 

      //set the url based on the link they were trying to access before being authenticated 
      $route = $this->session->get(self::$key); 

      //remove the session key 
      $this->session->remove(self::$key); 
      //if the referer key was never set, redirect to a default route 

     } else{ 

      $url = $this->generateUrl('BaseBundle_home_page'); 

      return new RedirectResponse($route); 

     } 

     return new RedirectResponse($route); 

    } 
} 
4

У меня была эта проблема тоже. Я использовал security.yml и в используемом действии регистрации:

$redirectUrl = $request->getSession()->get('_security.account.target_path'); 

наслаждайтесь.

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