我有一个symfony表单。提交它,我有一条错误消息:
The CSRF token is invalid. Please try to resubmit the form.
我不知道为什么我有这个。检查请求方法后,我将请求绑定到表单:
if ($request->getMethod() === 'POST') {
$form->handleRequest($request);
}
以下是表单的类型。
class PasswordActionType extends AbstractType {
protected $forgotten_password;
public function __construct($forgotten_password) {
$this->forgotten_password = $forgotten_password;
}
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options) {
$builder->add('identifiant', 'text', array('attr' => array('style' => 'width:250px')));
if(!$this->forgotten_password) {
$builder->add('ancienMDP', 'password', array(
'label' => 'Ancien MDP',
'attr' => array(
'class' => 'ligne',
'style' => 'width:252px'
)));
$builder->add('nouveauMDP', 'repeated', array(
'type' => 'password',
'invalid_message' => 'Confirmation différente du nouveau mot de passe',
'first_options' => array('label' => 'Nouveau MDP'),
'second_options' => array('label' => 'Confirmer'),
'options' => array(
'attr' => array(
'class' => 'ligne',
'style' => 'width:252px'
))
));
} else {
$builder->add('ancienMDP', 'hidden', array('error_bubbling' => false, 'data' => 'NULL'));
$builder->add('nouveauMDP', 'hidden', array('error_bubbling' => false, 'data' => 'NULL'));
}
}
public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => 'My\Bundle\Security\PasswordAction',
'csrf_protection' => true,
'csrf_field_name' => 'token'
));
}
public function getName() {
return 'cramif_password_action';
}
}
所以2个表单使用相同的构建器。区别在于“forgotten_password”的值。
form1:forgotten_password = true
2个字段'ancienMDP'和'NouveauMDP'是隐藏的html字段
form2:forgotten_password = false
这两个领域是你能看到的。
form1没有问题,没有CSRF错误。
form2会出现问题。
注意:2个表单与Twig一起显示,命令相同。
注意2:在twig模板中,我有一个form_rest
答案 0 :(得分:0)
只是为了帮助别人:
如果你认为你做得对:
在检查表单已发布后绑定请求
使用了form_rest。
检查您是否未使会话无效。当然,要使CSRF正常工作,您需要一个有效的会话。