我正在使用 Symfony 3.4 进行一些功能测试,但是我在提交带有 CSRF 令牌的表单时遇到了问题。
我尝试了很多解决方案,但总是失败:
private function makeAuthenticatedClient()
{
$credentials = array(
'username' => $this->user->getUsername(),
'password' => $this->user->getPassword(),
);
return $this->makeClient($credentials);
}
public function testAdd()
{
$client = $this->makeAuthenticatedClient();
$crawler = $client->request('POST', '/teachers/add');
// generates the CSRF token
$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken('division_item');
$client->request(
'POST',
'/teachers/add',
[
'teachers' => [
'name' => 'Test',
'_token' => $csrfToken,
]
],
[],
['HTTP_X-Requested-With' => 'XMLHttpRequest']
);
$this->assertTrue(
$client->getResponse()->isRedirect('/teachers/list')
);
}
Run Code Online (Sandbox Code Playgroud)
以我的形式:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Teacher::class,
'csrf_token_id' => 'division_item',
));
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
出现问题是因为我在发出请求后生成了 CSRF 令牌。这导致令牌生成两次(我发现它在 中倾倒了东西CsrfTokenManager)。
这有效:
// generates the CSRF token
$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken('division_item');
$crawler = $client->request('POST', '/teachers/add');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |