我正在为我工作的公司使用的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:错误:调用未定义的方法 Symfony \ Component \ HttpFoundation \ HeaderBag :: getCookies()in DefaultController.php第713行
我能做些什么才能让它发挥作用?
修改
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
时,3个CakePHP域都使用new.domain.org
,而Symfony2使用的一个cookie将其域名显示为new.domain.org
。虽然Symfony2仍然拒绝加载我想要的Cookie。
答案 0 :(得分:1)
我在朋友的帮助下想出来了。
基本上,CakePHP中设置的cookie不包含路径。为了解决这个问题,我添加了以下PHP代码:
$value = $someone['User']['id'];
setcookie("passport", $value, time()+1200, "/", ".domain.org");
然后我检查了Symfony2,没有更改上一次编辑的代码,然后Symfony2可以拿起cookie。
谢谢大家的帮助!
答案 1 :(得分:0)
在每个请求期间,默认情况下,Symfony2将在Twig和PHP模板引擎中设置全局模板变量应用程序。 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.
实施例: 在树枝上:{{app.request.method}} 在PHP中:echo $ app-> getRequest() - > getMethod()在twig中:{{app.user.username}} 但对于会话对象: 在树枝上:{{app.session.varname}} 在PHP中://我不知道,你知道怎么称它吗?