0

我正在为我工​​作的公司使用的 Web 应用程序构建一个替代品。它是使用 CakePHP 1.3 构建的,我正在使用 Symfony 2 从头开始​​重写它。这两个系统将并行运行,各种功能被转移到 Symfony 2 并从旧的 CakePHP 应用程序中删除。

为了避免与登录细节混淆,我希望 CakePHP 处理用户登录方面的事情,直到我可以完全关闭 CakePHP 并依赖 Symfony 2 的安全性。与此同时,CakePHP 应用程序生成一个包含用户 ID 的 cookie。我想为 Symfony 使用这个 cookie 作为一种基本的安全形式。

但是,我无法让 Symfony 读取或加载已创建的 cookie。这是我的代码:

public function securitytestAction()
{   

    $request = $this->getRequest($_COOKIE);
    $cookie = $request->headers->getCookies('CakeCookie[passport]');

    print_r($cookie);

    return $this->render('InstructorBundle:Default:test.html.twig');
}

使用 Firebug,CakePHP 在登录期间生成的 Cookie 名为“CakeCookie[passport]”。它也没有加密。

我得到的错误是这样的:

FatalErrorException:错误:在 DefaultController.php 第 713 行调用未定义的方法 Symfony\Component\HttpFoundation\HeaderBag::getCookies()

我该怎么做才能让它工作?

编辑
Cheesemacfly 建议更换:

$request = $this->getRequest($_COOKIE);
$cookie = $request->headers->getCookies();

就这样:

$request = $this->getRequest()->cookies->all();

我得到以下回复:

数组([PHPSESSID] => gptbmh61mfkqn6p86d3suhnt13)

编辑 2
我一直在查看 CakePHP 用于生成 Cookie 的代码,但它没有为 cookie 提供域。我现在已经修复了它,以便域为.domain.org,以便子域也可以访问它。

现在,当我使用 Firebug 访问 Symfony2 应用程序时,我可以看到 Cookie 与其他两个 CakePHP 会话 cookie(我不需要)一起列出。www.domain.org即使在查看 subdomain 时, 3 个 CakePHP 域都在使用new.domain.org,而 Symfony2 使用的一个 cookie 将其域名显示为new.domain.org.Symfony2 尽管仍然拒绝加载我想要的 Cookie。

4

2 回答 2

1

我在朋友的帮助下想通了。

本质上,在 CakePHP 中设置的 cookie 不包含路径。为了解决这个问题,我添加了以下 PHP 代码:

$value = $someone['User']['id'];
setcookie("passport", $value, time()+1200, "/", ".domain.org");

然后我检查了 Symfony2,没有更改之前编辑的代码,然后 Symfony2 可以获取 cookie。

谢谢大家的帮助!

于 2013-07-23T13:23:19.467 回答
0

在每次请求期间,Symfony2 默认会在 Twig 和 PHP 模板引擎中设置一个全局模板变量 app。app 变量是一个 GlobalVariables 实例,它可以让您自动访问一些特定于应用程序的变量:

app.security - The security context.
app.user - The current user object.
app.request - The request object.
app.session - The session object.
app.environment - The current environment (dev, prod, etc).
app.debug - True if in debug mode. False otherwise.

示例: 在 twig 中:{{ app.request.method }} 在 PHP 中:echo $app->getRequest()->getMethod() 在 twig 中:{{ app.user.username }} 但对于会话对象:在 twig : {{ app.session.varname }} 在 PHP 中: // 不知道,你知道怎么调用吗?

于 2013-07-22T16:06:26.957 回答