Как symfony2 перенаправляет на запрашиваемую страницу после входа в систему

19

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

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

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

    
задан Arif 18.04.2013 в 11:44
источник

4 ответа

27

Это возможно, и вы можете получить доступ к ссылочной ссылке (которая используется, если для 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') ) не будет работать в этом случае, потому что он всегда будет возвращать ссылку для входа.

Спасибо Роману Маринценко & amp; Райан Уивер для этого блога

    
ответ дан Carrie Kendall 11.07.2013 в 00:26
  • Есть ли у вас какие-либо советы по этому делу? Здесь нам нужен реферер реферера ... –  Amine Jallouli 02.01.2015 в 18:02
  • @aminejallouli, вероятно, вам лучше всего будет хранить эту информацию где-нибудь (т.е. сеанс) и получить доступ к ней, когда она вам понадобится. –  Carrie Kendall 05.01.2015 в 22:12
  • Вот как я это сделал! Он работает сейчас! :) Благодаря –  Amine Jallouli 09.01.2015 в 12:30
  • Это сработало для меня, Cheers! –  Muzafar Ali 18.08.2016 в 07:34
11

Решение Кэрри Кендалл сработало, спасибо!

Вот полная реализация в 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);

    }
}
    
ответ дан David Lefkon 14.11.2013 в 16:08
4

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

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

пользоваться.

    
ответ дан Dmitry Davydov 19.03.2014 в 17:53
3

Symfony использует заголовок HTTP Referer , чтобы перенаправить пользователя обратно на страницу, с которой он пришел .. т.е. ссылающийся

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

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

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

Примечание : заголовок написан неправильно, его реферер (один r)

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