3

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

    命名空间 Me\MyBundle\Handler;
    
    使用 Symfony\Component\Security\Http\HttpUtils;
    使用 Symfony\Component\HttpFoundation\RedirectResponse;
    使用 Symfony\Component\HttpFoundation\Request;
    使用 Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    使用 Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
    
    
    类 AuthenticationSuccessHandler 扩展 DefaultAuthenticationSuccessHandler {
    
        受保护的$路由器;
    
        公共函数__construct(HttpUtils $httpUtils,数组$options,$router){
        $this->router = $router;
            父::__construct($httpUtils, $options);
        }
    
        公共函数 onAuthenticationSuccess( 请求 $request, TokenInterface $token ) {
            
        $user = $token->getUser();
        
        if($user->getProfileComplete()!=1){
    //重定向到配置文件编辑
            $url = 'fos_user_profile_edit';
        }别的{
            $referer = $request->headers->get('referer');
            if($referer == NULL){
    //如果没有引用者则重定向到自定义url
                $url = 'My_customurl';
            }别的{
    //重定向到引用者
                $url = $推荐人;
            }
        }
    
        return new RedirectResponse($this->router->generate($url));
        }
    }

我的 security.yml 注意到我在 fos_facebook 和 form_login 中都声明了 use_referrer:

防火墙:
        主要的:
            模式:^/
            fos_facebook:
              app_url:“http://apps.facebook.com/app”
              server_url: "http://www.app.com"
              登录路径:/用户/登录
              check_path:/facebook/login_check
              提供者:fos_facebook_provider
              成功处理程序:my_auth_success_handler
              use_referer: 真
            表单登录:
                提供者:fos_userbundle
                csrf_provider:form.csrf_provider
                登录路径:/用户/登录
                check_path: /user/login_check
                使用转发:假
                成功处理程序:my_auth_success_handler
                use_referer: 真
                失败路径:空
            登出:
                路径:/用户/注销
            匿名:~
            记得我:
                  密钥:mySuperKey
                  寿命:4147200
                  小路: /
                  域名:~

当我登录并且我的个人资料没有完成时,我被成功重定向但是当它完成并且推荐人不为空时,我遇到了 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”

任何想法,我都快疯了。我认为这是因为引荐已经存储了用户/登录名,并且当它转到 login_check 时再次转到用户/登录名。

4

1 回答 1

4

您正在尝试使用实际 url 生成路由,而不是路由名称。试试这个代码:

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);
于 2013-11-14T17:47:17.390 回答