AuthenticationSuccessHandler,登录后重定向和referer

时间:2013-11-14 17:23:30

标签: symfony fosuserbundle

我刚刚在这个论坛的帮助下添加了一个AuthenticationSuccessHandler,当用户通过fosuserbundle或fosfacebookbundle登录时,我会在我的网站上实现重定向。当用户完成配置文件时,重定向会发生变化,如果配置完成,我希望将其重定向到以前的位置,这就是我使用referer变量的原因。

    namespace Me\MyBundle\Handler;

    use Symfony\Component\Security\Http\HttpUtils;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;


    class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler {

        protected $router;

        public function __construct( HttpUtils $httpUtils, array $options, $router) {
        $this->router = $router;
            parent::__construct( $httpUtils, $options );
        }

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

        $user = $token->getUser();

        if($user->getProfileComplete()!=1){
    //redirects to profile editing
            $url = 'fos_user_profile_edit';
        }else{
            $referer = $request->headers->get('referer');
            if($referer == NULL){
    //redirects to custom url if there is not any referer
                $url = 'My_customurl';
            }else{
    //redirects to the referer
                $url = $referer;
            }
        }

        return new RedirectResponse($this->router->generate($url));
        }
    }

我的security.yml请注意,我在fos_facebook和form_login中声明了use_referer:

firewalls:
        main:
            pattern: ^/
            fos_facebook:
              app_url: "http://apps.facebook.com/app"
              server_url: "http://www.app.com"
              login_path: /user/login
              check_path: /facebook/login_check
              provider: fos_facebook_provider
              success_handler: my_auth_success_handler
              use_referer: true
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                login_path: /user/login
                check_path: /user/login_check
                use_forward: false
                success_handler: my_auth_success_handler
                use_referer: true
                failure_path: null
            logout:
                path: /user/logout
            anonymous: ~
            remember_me:
                  key:      mySuperKey
                  lifetime: 4147200
                  path:     /
                  domain:   ~

当我登录并且我没有完成我的个人资料时,我成功地重定向但是当它完成并且referer不为null时我有500个错误:

当我使用facebook登录时,我收到500错误:“无法生成指定路由”http://app.com/app_dev.php/user/login“的URL,因为此路由不存在。”而firefox中的网址是:“http://app.com/app_dev.php/facebook/login_check

当我使用表单登录时,我收到500错误:“无法生成指定路由”http://app.com/app_dev.php/user/login“的URL,因为此路由不存在。”而firefox中的网址是:“http://app.com/app_dev.php/user/login_check

任何想法,我都疯了。我认为它是因为referal存储了用户/登录,当它转到login_check时再次转到用户/登录...

提前谢谢!!!

1 个答案:

答案 0 :(得分:4)

您正在尝试使用实际网址生成路线,而不是路线名称。试试这段代码:

if ($user->getProfileComplete() != 1) {
    $url = $this->router->generate('fos_user_profile_edit');
} else {
    $referer = $request->headers->get('referer');
    if ($referer == NULL) {
        $url = $this->router->generate('My_customurl');
    } else {
        $url = $referer;
    }
}

return new RedirectResponse($url);