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エラーが発生します。
それはすべきです!
なぜそれをしたいですか? – j0k
私のクライアントは、ユーザーがログインページにどれだけ長く座っていても、ログインフォームが有効であることを望んでいるからです。さらに、私は個人的にこの特定のウェブサイトにCSRFの保護が必要だとは思わない。 –