Symfony2 - 重定向后身份验证丢失

时间:2012-10-01 20:35:41

标签: symfony

我今天遇到了SF2应用程序的问题。 我希望用户在提交有效的订阅表单后自动进行身份验证。

所以基本上在我的控制器里这就是我的工作:

if ($form->isValid()) {
    $customer = $form->getData();

    try {
        $customer = $this->get('my.service.manager.customer')->customerSubscribe($customer);
    } catch (APIClientException $e) {
        $error = $e->getErrors();
        ...
    }

    if ($customer && !isset($error)) {
        // connect customer
        $token = new UsernamePasswordToken($customer, null, 'api_auth', array('ROLE_USER'));
        $this->get('security.context')->setToken($token);

        ...
    }

    return new RedirectResponse($this->generateUrl('MyBundle_index'));
}

“连接客户”评论下方的两行实际上似乎对用户进行了正确的验证。 问题是当我使用RedirectResponse重定向到另一个页面时,身份验证将丢失。

我已经尝试过调用

$this->container->get('security.context')->isGranted('ROLE_USER')

在调用RedirectResponse之前返回true,在我的另一个重定向响应的控制器中返回false。

此时我对自己做错了有点困惑。任何想法都赞赏。 顺便说一下,我正在使用Symfony2.1

2 个答案:

答案 0 :(得分:1)

我注意到,当您一次重定向多次时会发生这种情况。 MyBundle_index路由的控制器是否返回另一个重定向?如果是这样,我认为这是你的答案。

否则,也许尝试使用转发?而不是:

return new RedirectResponse($this->generateUrl('MyBundle_index'));

...只需转发为该路线定义的控制器/动作:

return $this->forward("SomeBundle:Default:index");

用户在其地址栏中结束的网址可能不是您所期望的(它不会从他们原先请求的更改),但您可以根据自己的喜好进行调整以达到您的喜好

答案 1 :(得分:1)

好的,我这样解决了:

$token = new UsernamePasswordToken($customer->getEmail(), null, 'api_auth', array('ROLE_USER'));

显然我需要传递客户ID(在这种情况下是电子邮件)作为UsernamePasswordToken的第一个参数,而不是整个客户对象。我不确定为什么因为我的实体Customer实现了_toString方法,但至少它可以正常工作。