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

标签 php symfony symfony-2.1

我目前正在将一个 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 中不行,数据未在 session 中设置。

有什么想法吗?

编辑(添加更多信息):

看来问题出在方法“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));
}

在我的例子中,if "$token instanceof AnonymousToken"为真,因此 session key 被删除。如果我注释掉该代码,一切都会按预期工作。

所以我想我的新问题是:我该怎么做才能使 token 不匿名?

最佳答案

验证用户的正确方法是:

$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();

关于php - Symfony 2.1 功能测试中的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451969/

相关文章:

forms - Symfony 未在 Twig 中显示错误

symfony - 将验证组设置为 symfony 2 中的嵌入表单

php - 从数据库中获取值并存储在变量中

php - Goutte-dom爬虫-移除节点

templates - 如何在 Symfony2 环境中注册另一个(自定义)Twig 加载器?

php - 使用另一个 symfony2 项目作为供应商

php - 如何使用表单在 symfony 2 中编辑用户权限?

php - 用每行的增量数字替换特定行的字符

php - Bootstrap CSS 会覆盖主题吗?

php - 如何从具有两个字段且其中一个在 mysql、php 中具有重复值的单个表中获取结果