Symfony 2.1 中功能测试中的身份验证

2022-08-30 21:17:25

我目前正在将2.0.*项目迁移到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 中不按预期工作,数据不会在会话中设置。

有什么想法吗?

编辑(添加更多信息):

似乎问题出在“onKernelResponse”方法中的文件“Symfony\Component\Security\Http\Firewall\ContextListener”中。有以下代码:

if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
    $session->remove('_security_'.$this->contextKey);
} else {
    $session->set('_security_'.$this->contextKey, serialize($token));
}

在我的情况下,如果“$token AnonymousToken的实例”为真,因此会话密钥将被删除。如果我注释掉代码,一切都按预期工作。

所以我想我的新问题是:我能做些什么来使令牌不是匿名的?


答案 1

对用户进行身份验证的正确方法是:

$firewallName = 'your-firewall-name';
$container = self::$kernel->getContainer()
$token = new UsernamePasswordToken($user, null, $firewallName, $user->getRoles());
$container->get('security.context')->setToken($token);

和防火墙身份验证:

$session = $container->get('session');
$session->set('_security_'.$firewallName, serialize($token));
$session->save();

答案 2

我已登录票证:https://github.com/symfony/symfony/issues/3287

Symfony 2.1 RC似乎存在一个存在问题。


推荐