Мы успешно настроили FOSUserBundle; логин, регистрация, сброс пароля и т. д., все работают нормально.
Теперь мы хотим включить форму входа в наш общий макет сайта, в частности, разместив форму в верхнем правом разделе заголовка макета. Делать это было бы достаточно легко, если бы мы просто имели дело с полями имени пользователя и пароля. Однако мы не можем понять, как получить токен CSRF, который генерируется службой FOSUserBundle:
$this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');
Я попробовал вызывать это в расширении Twig, которое в противном случае работает нормально, но, видимо, расширение не может правильно ссылаться на контейнер.
Конечно, есть какой-то простой способ получить маркер FOSUserBundle CSRF во всем мире?
Благодаря! Джейсон
Вы можете определить такую функцию в одном из ваших контроллеров
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;
Symfony 2.3:
Одним из возможных решений было бы определить поставщика 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') }}" />