【发布时间】:2022-01-11 15:35:49
【问题描述】:
我正在使用 symfony 5.4
我不明白 symfony 真正需要什么来纠正这种弃用:
从 symfony/security-csrf 5.3 开始:在没有会话的情况下使用“Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage”没有任何效果并且已被弃用。它将在 Symfony 6.0 中抛出“Symfony\Component\HttpFoundation\Exception\SessionNotFoundException” 1x 在 MeansCablesControllerTest::TestDatagridAdd 从 App\Tests\Controller
我在 tests/Controller/MeansBenchesControllerTest.php (WebTestCase) 中的函数:
function datagridAddUpdate($controllerName, $dataArray)
{
$client = static::createClient();
$usersRepository = static::getContainer()->get(UsersRepository::class);
$testUserAdmin = $usersRepository->find(1);
$client->loginUser($testUserAdmin);
$csrfToken = $client->getContainer()->get('security.csrf.token_manager')->getToken($controllerName.'Token_item');
$dataArray['_token'] = $csrfToken;
$crawler = $client->request('POST', '/datagridAddUpdate/'.$controllerName,$dataArray, [], ['HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest']);
$this->assertResponseIsSuccessful('Status code 2xx pour datagridAdd : '.$controllerName);
}
【问题讨论】:
-
通过
GET请求页面并使用Crawler'sform()function 也可以获得令牌并绕过弃用,无需在场边生成它。 -
是的,它可以是一个解决方案,但它不能完全回答这个问题。不了解 symofny 需要什么以及如何实现它可能很有趣;)
-
这是我在过渡期间必须选择的解决方案,因为据我所知,没有“官方”替代品。现在访问会话需要RequestStack,但我认为这在这种情况下不起作用,因为直到......你知道......请求页面之前没有请求。在github 中有a couple 和related discussions,但到目前为止还没有(合并的)替代方案。因此,如果您发布并在找到一个时回答,我将不胜感激。
-
作为一个临时解决方案,我只在测试环境中创建了一个路由,该路由返回带有给定字符串的令牌值,因此我可以在我的测试中使用它,而无需从表单中获取令牌。这对于 ajax 路由测试也很有用。