我目前正在将2.0。*项目迁移到Symfony当前的2.1测试版。Symfony 2.1中的功能测试中的身份验证
在我的功能测试,我现在有这样的代码来创建一个客户端身份验证:
$client = // create a normal test client
$role = 'ROLE_USER';
$firewallName = 'main';
$user = // pull a user from db
$client->getCookieJar()->set(new \Symfony\Component\BrowserKit\Cookie(session_name(), true));
$token = new UsernamePasswordToken($user, null, $firewallName, array($role));
self::$kernel->getContainer()->get('session')->set('_security_' . $firewallName,
serialize($token));
这个工程预期在2.0 *而不是在2.1,该数据不会在会话中设置。
任何想法?
编辑(添加详细信息):
看来问题就出在文件 “的Symfony \分量\安全\ HTTP \防火墙\ ContextListener” 中的方法 “onKernelResponse” 的。有这样的代码:
if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
$session->remove('_security_'.$this->contextKey);
} else {
$session->set('_security_'.$this->contextKey, serialize($token));
}
在我的情况下,如果“$令牌的instanceof AnonymousToken”是真实的,正因为如此会话密钥被删除。如果我注释掉代码,一切都按预期工作。
所以我想我的新问题是:我能做些什么来使令牌不是匿名的?
我使用的是非常相似的片段,以你的登录特定功能测试用户。我也升级到了2.1,并且真的让我很开心,因为我的许多功能测试现在都失败了。 – 2012-08-07 06:05:38
我发现在ContextListener.php中,ac所有的都是$ this-> context-> setToken(null),并且因为$ session === null而被调用?嗯... – 2012-08-07 06:44:22
当我注释掉ContextListener.php:第77行 - $ this-> context-> setToken(null)时,我的测试完美无缺!所以也许这是一个线索! – 2012-08-07 06:49:11