symfony2在登录后如何重定向到请求页面

symfony2在登录后如何重定向到请求页面,symfony,Symfony,假设我的路线/booking/(.*)受security.yml中的防火墙配置保护,它需要“角色用户”,当用户尝试访问任何前面带有“/booking/”的路线时,应用程序会将用户重定向到登录页面进行身份验证 因此,我的问题是,在用户提供其凭据并通过身份验证后,Symfony 2如何将用户重定向回用户请求的页面/路由,或者Symfony 2将该路由存储在哪里?它是否将其存储在某个会话或其他位置 我们可以访问它吗?如何访问?Symfony使用将用户重定向回他们来自的页面。。推荐人 您可以使用secu

假设我的路线/booking/(.*)security.yml中的防火墙配置保护,它需要“角色用户”,当用户尝试访问任何前面带有“/booking/”的路线时,应用程序会将用户重定向到登录页面进行身份验证

因此,我的问题是,在用户提供其凭据并通过身份验证后,Symfony 2如何将用户重定向回用户请求的页面/路由,或者Symfony 2将该路由存储在哪里?它是否将其存储在某个会话或其他位置

我们可以访问它吗?如何访问?

Symfony使用将用户重定向回他们来自的页面。。推荐人

您可以使用security.yml中的security configuration
use\u referer:true
进行设置

您可以使用以下命令从控制器访问referer标头:

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

注意标题是miss spelt,它的referer(一个r)

这是可能的,您可以在会话中访问引用链接(如果
use\u referer
设置为
true
,则使用该链接)

例如,如果您的
表单登录
(在防火墙配置中)上有一个
success\u handler
服务,该服务根据某些条件(通常是角色)重定向用户,但如果设置了,您希望将用户重定向到referer链接,则可以访问referer链接,如下所示:

$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')
)将不起作用,因为它将始终返回登录链接


感谢Roman Marintsenko和Ryan Weaver的帮助,Carrie Kendall的解决方案成功了,谢谢

以下是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);

    }
}

我也有这个问题。我使用security.yml并在注册操作中使用:

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

享受。

谢谢你的回答,但我需要的是一点不同。经过一番搜索,我找到了问题的答案。你对这个案子有什么建议吗?在这里,我们确实需要推荐人的推荐人…@aminejallouli您最好将该信息存储在某个地方(即会话),并在需要时访问它。您可以使用TargetPathTrait,然后只需调用函数getTargetPath($request->getSession(),$firewall\u name)