我目前正在将一个2.0.*项目迁移到当前的Symfony 2.1 beta。
在我的功能性测试中,我目前有这段代码来创建一个带有身份验证的客户端:
$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\Component\Security\Http\Firewall\ContextListener" 的 "onKernelResponse" 方法中。代码如下:
if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
$session->remove('_security_'.$this->contextKey);
} else {
$session->set('_security_'.$this->contextKey, serialize($token));
}
在我的情况下,如果"$token instanceof AnonymousToken"为真,则会删除会话密钥。如果我注释掉那段代码,一切都按预期工作。
因此,我的新问题是:我该怎么做才能使令牌不是匿名的?