来自控制器的 CSRF 令牌

CSRF Token from the controller

我有一个控制器正在发布一个表单。

public function myPostAction(Request $request)
{
    $form = $this->createForm('my_form', $my_object);
    $form->handleRequest($request);
#...

我可以看到我的 CSRF 令牌作为参数发布

my_form[_token] => lH38HTm5P0Cv3TOc4-9xi2COx-cZ670mpJ_36gR8ccI

我只需要阅读它

$form->get('_token')

这告诉我

Child "_token" does not exist.

我怎样才能得到这个令牌?

您可以通过以下方式获得它:

$request->request->get('my_form[_token]');

如果您没有禁用 CSRF 保护,它将自动应用和验证,您无需自行检查。

这是我将同时使用的解决方法:

$token = $request->get($form->getName())['_token'];

偶然间我也注意到生成token的intention是表单名

$csrf = $this->get('form.csrf_provider');
$intention = $form->getName();
$token = $csrf->generateCsrfToken($intention);

正如@Pierre de LESPINAY 所说,可以通过检索令牌管理器服务来实现。

此服务也可以像这样注入到您的构造函数中:

use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
...
public function __construct(CsrfTokenManagerInterface $tokenManager)
{
    $this->tokenManager = $tokenManager;
}

之后像之前演示的那样使用:

$token = $this->tokenManager->getToken('myformname')->getValue();