10

FOSUserBundleが正常に構成されました。ログイン、登録、パスワードのリセットなどはすべて正常に機能しています。

次に、ログインフォームを一般的なサイトレイアウトに組み込みます。特に、フォームをレイアウトヘッダーの右上のセクションに配置します。ユーザー名とパスワードのフィールドを処理するだけであれば、これを行うのは簡単です。ただし、FOSUserBundleサービスによって生成されたCSRFトークンを取得する方法がわからないようです。

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

Twig拡張機能内で上記を呼び出してみましたが、それ以外の場合は正常に機能しますが、拡張機能がコンテナーを適切に参照できないようです。

確かに、FOSUserBundle CSRFトークンをグローバルに取得する簡単な方法はありますか?

ありがとう!ジェイソン

4

2 に答える 2

44

シンフォニー 2.3:

考えられる解決策の 1 つは、次のように csrf プロバイダーを Twig グローバル変数として定義することです。

twig:
    globals:
        fos_csrf_provider: "@form.csrf_provider"

そして、レイアウトで次のように呼び出します。

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.generateCsrfToken('authenticate') }}" />

したがって、コントローラーを呼び出す必要はありません。

symfony 2.4 以降:

twig:
    globals:
        fos_csrf_provider: "@security.csrf.token_manager"

と:

<input type="hidden" name="_csrf_token" value="{{ fos_csrf_provider.refreshToken('authenticate') }}" />
于 2013-06-21T11:18:05.453 に答える
6

コントローラーの1つでこのような関数を定義できます

public function getTokenAction()
{
    return new Response($this->container->get('form.csrf_provider')
                            ->generateCsrfToken('authenticate'));
}

そして、それをフォームに埋め込むだけです

<input type="hidden" name="_csrf_token" value="{% render('YourBundle:YourController:getToken') %}" />

また、コントローラーの上部に以下を含める必要があります。

use Symfony\Component\HttpFoundation\Response;
于 2012-06-06T06:47:47.940 に答える