Отключить токен CSRF в форме входа
Я использую Symfony2.0 и FOSUserBundle, и хотел бы отключить токен csrf в моей форме входа в систему.
Я отключил защиту csrf глобально на моем веб-сайте в моей конфигурации.в формате YML:
framework:
csrf_protection:
enabled: false
это работает хорошо, в мои формы не добавлено поле csrf. Однако, это не относится к форме входа. Только в этой форме я получаю ошибку "недопустимый токен CSRF", если я не включаю токен в форму с:
<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
Как я могу отключить Токен CSRF в форме входа?
4 ответов
Если вы просто идете к своей безопасности.YML-файл и удалите csrf_provider из директивы form_login, не нужно обновлять класс действий или что-либо еще.
вы можете отключить защиту CSRF в своем классе формы, установив 'csrf_protection' => false
в массиве опций:
class LoginType extends AbstractType
{
// ...
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\UserBundle\Entity\User',
'csrf_protection' => false
);
}
// ...
}
если вы используете FormBuilder для создания формы вместо класса AbstractType, вы можете передать массив options в качестве второго параметра для createFormBuilder()
такой:
$form = $this->createFormBuilder($users, array('csrf_protection' => false))
->add( ... )
->getForm();
если вы используете FOSUserBundle, и вы хотели бы отключить защиту CSRF только в форме входа в систему, есть несколько шагов, чтобы следовать.
Шаг 1) Создайте свой собственный пользовательский пакет и файл контроллера безопасности
чтобы обойти SecurityController, встроенный в FOSUserBundle, необходимо сначала создать свой собственный пользовательский пакет.
Итак, создайте файл с именем app/src/{YourApp}/UserBundle/Controller / SecurityController.РНР Вы должны расширить исходный класс SecurityController и копирование через метод loginAction
use FOS\UserBundle\Controller\SecurityController as SecurityControllerOrig;
class SecurityController extends SecurityControllerOrig
{
public function loginAction(Request $request)
{
}
}
в методе loginAction прокомментируйте или удалите эти строки:
$csrfToken = $this->container->has('form.csrf_provider')
? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')
: null;
затем убедитесь, что ничего не передается для просмотра для токена CSRF:
return $this->renderLogin(array(
'last_username' => $lastUsername,
'error' => $error,
'csrf_token' => false,
));
Шаг 2) отключить проверку CSRF в брандмауэре Symfony (безопасность.в формате YML)
убедитесь, что вы прокомментируете существующую строку "csrf_provider:" в безопасности.в формате YML:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
#csrf_provider: form.csrf_provider
Шаг 3) переопределить маршрутизация для контроллера безопасности FOSUserBundle (маршрутизация.в формате YML)
в маршрутизации.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: вам нужна часть "expose: true"! В противном случае вы получите ошибку JavaScript из пакета маршрутизации fos js.
это должно сделать это!
Я должен переопределить SecurityController loginAction, где форма входа instanciated.
Я заменил:
$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,
));