17

Symfony2.0 と FOSUserBundle を使用していますが、ログイン フォームで csrf トークンを無効にしたいと考えています。

config.yml で、Web サイトの csrf 保護をグローバルに無効にしました。

framework:
    csrf_protection:
        enabled:        false

これはうまく機能しています。フォームに csrf フィールドが追加されていません。ただし、これはログインフォームには適用されません。このフォームでのみ、次のようにフォームにトークンを含めないと、「無効な CSRF トークン」エラーが発生します。

<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

ログインフォームで CSRF トークンを無効にするにはどうすればよいですか?

4

4 に答える 4

29

'csrf_protection' => falseoptions 配列に次のように設定することで、フォーム クラスで CSRF 保護を無効にすることができます。

class LoginType extends AbstractType
{
    // ...

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class'      => 'Acme\UserBundle\Entity\User',
            'csrf_protection' => false
        );
    }

    // ...

} 

AbstractType クラスの代わりに FormBuilder を使用してフォームを作成する場合は、次のcreateFormBuilder()ようにオプション配列を 2 番目のパラメーターとして渡すことができます。

$form = $this->createFormBuilder($users, array('csrf_protection' => false))
        ->add( ... )
        ->getForm();
于 2013-03-07T11:16:47.117 に答える
19

security.yml ファイルに移動して、form_login ディレクティブから csrf_provider を削除するだけであれば、アクション クラスなどを更新する必要はありません。

于 2013-03-11T14:18:43.847 に答える
0

ログインフォームがインスタンス化されるFOSUserBundle の SecurityController loginActionをオーバーライドする必要がありました。

私は置き換えました:

$csrfToken = $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');

return $this->container->get('templating')->renderResponse('FOSUserBundle:Security:login.html.'.$this->container->getParameter('fos_user.template.engine'), array(
        'last_username' => $lastUsername,
        'error'         => $error,
        'csrf_token' => $csrfToken,
    ));

と:

return $this->container->get('templating')->renderResponse('FOSUserBundle:Security:login.html.'.$this->container->getParameter('fos_user.template.engine'), array(
        'last_username' => $lastUsername,
        'error'         => $error,
        'csrf_token' => false,
    ));
于 2013-03-11T10:04:15.453 に答える