来自控制器的CSRF令牌

时间:2015-02-18 18:52:55

标签: symfony csrf symfony-forms

我有一个控制器发布表格。

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"不存在。

我如何获得此令牌?

3 个答案:

答案 0 :(得分:8)

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

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

我也偶然注意到用于生成令牌的intention是表单名称

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

答案 1 :(得分:1)

你可以通过以下方式获得:

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

如果你没有禁用CSRF保护,它将自动应用和验证,你不需要自己检查。

答案 2 :(得分:0)

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

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

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

然后像以前演示的那样用于以后:

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