2013-03-07 22 views
14

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

私は私のconfig.ymlで私のウェブサイト上でグローバルにCSRFの保護を無効にしている:

framework: 
    csrf_protection: 
     enabled:  false 

これがうまく機能している、私の形に添加無CSRFフィールドがありません。 ただし、これはログインフォームには適用されません。私は、ログインフォームにCSRFトークンを無効にするにはどうすればよい

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

:私は、フォーム内のトークンが含まれていない場合のみ、このフォームで、私は「無効CSRFトークン」エラーが出ますか?

+1

なぜそれをしたいですか? – j0k

+0

私のクライアントは、ユーザーがログインページにどれだけ長く座っていても、ログインフォームが有効であることを望んでいるからです。さらに、私は個人的にこの特定のウェブサイトにCSRFの保護が必要だとは思わない。 –

答えて

15

あなたは自分のsecurity.ymlファイルに移動し、form_loginディレクティブからcsrf_providerを削除する場合は、アクションを更新する必要はありませんクラスや何か。

+0

さて、これは受け入れられた答えでなければなりません.. –

27

あなたは、そのオプション配列で'csrf_protection' => falseを設定することで、あなたのフォームクラスで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(); 
+0

問題は、このようなLoginTypeクラスがないことです。 Symfony2 LoginTypeクラスを拡張してcsrf_protectionプロパティをfalseに設定するだけでいいですか?もっと簡単な方法はありますか? –

+0

答えを更新しました。それが役に立てば幸い。 –

+0

はい、私は、FOSUserBundleのSecurityControllerを見て、csrfをfalseに設定しなければならないことに気付きました。私は自分の答えを投稿しましたが、進める方法の詳細があります。 +1 –

0

私は、ログインフォームがインスタンス化されoverride FOSUserBundle's 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, 
    )); 
1

FOSUserBundleを使用していて、ログインフォームでのみCSRF保護を無効にしたい場合は、いくつか手順があります。

ステップ1)&セキュリティコントローラが過乗るFOSUserBundleに組み込まれSecurityControllerをするために

ファイル独自のユーザー・バンドルを作成し、あなたはまず独自のユーザー・バンドルを作成する必要があります。

だから、あなたは元SecurityControllerクラスを拡張する必要がありアプリ/ SRC/{} YourApp /UserBundle/Controller/SecurityController.php というファイルを作成し、LoginActionの内LoginActionの方法

use FOS\UserBundle\Controller\SecurityController as SecurityControllerOrig; 
class SecurityController extends SecurityControllerOrig 
{ 
    public function loginAction(Request $request) 
    { 
    } 
} 

をコピーこの方法は、コメントアウト、またはこれらの行削除します。次に

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

を何もCSRFトークンのビューに渡されていないことを確認してください:

セキュリティで行:

ステップ2)symfonyのファイアウォールでチェックを無効にCSRF(security.ymlファイル)は

既存の "csrf_provider" をコメントアウトしていることを確認します。YML:

firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       #csrf_provider: form.csrf_provider 

ステップ3)これらの行をコメントアウトし、routing.ymlでFOSUserBundleのセキュリティコントローラ(のrouting.yml)

のルーティングをオーバーライド:

fos_user_security: 
    resource: "@FOSUserBundle/Resources/config/routing/security.xml" 
    options: 
     expose: true 

は、以下の行を追加します。コメントアウトされた行:

#Over-ride the SecurityController of the FOSUserBundle: 
fos_user_security_login: 
    path: /login 
    defaults: { _controller: YourAppUserBundle:Security:login } 
    methods: [GET] 
    options: 
    expose: true 

fos_user_security_check: 
    path: /login_check 
    defaults: { _controller: FOSUserBundle:Security:check } 
    methods: [POST] 
    options: 
    expose: true 

fos_user_security_logout: 
    path: /logout 
    defaults: { _controller: FOSUserBundle:Security:logout } 
    methods: [GET] 
    options: 
    expose: true 

注1:私は、loginActionメソッドをあなたのカスタムSecurityController。他の2つのメソッドは親クラスに移動します(違いがあるかどうかはわかりません)。

注2:「公開:真」の部分が必要です。そうしないと、fos jsルーティングバンドルからJavaScriptエラーが発生します。

それはすべきです!

関連する問題