0

我今天遇到了我的 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

4

2 回答 2

1

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

否则,也许尝试使用前锋?代替:

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

...只是转发到为该路由定义的任何控制器/操作:

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

用户最终在其地址栏中使用的 URL 可能不是您所期望的(它不会与他们最初请求的 URL 不同),但您可能可以对其进行调整以使其符合您的喜好。

于 2012-10-01T20:47:55.177 回答
1

好的,我这样解决了:

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

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

于 2012-10-02T21:34:13.647 回答