Отключить токен CSRF в форме входа - программирование
Подтвердить что ты не робот

Отключить токен CSRF в форме входа

Я использую Symfony2.0 и FOSUserBundle и хотел бы отключить токен csrf в моей форме входа.

Я отключил защиту csrf во всем мире на моем веб-сайте в моем config.yml:

framework:
    csrf_protection:
        enabled:        false

Это хорошо работает, в мои формы не добавлено поля csrf. Однако это не относится к форме входа в систему. Только в этой форме я получаю ошибку "Недопустимый токен CSRF", если я не включаю токен в форму с помощью:

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

Как отключить токен CSRF в форме входа?

4b9b3361

Ответ 1

Если вы просто перейдете в файл security.yml и удалите csrf_provider из директивы form_login, не нужно обновлять класс действия или что-то еще.

Ответ 2

Вы можете отключить защиту 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, вы можете передать массив параметров в качестве второго параметра для createFormBuilder() следующим образом:

$form = $this->createFormBuilder($users, array('csrf_protection' => false))
        ->add( ... )
        ->getForm();

Ответ 3

если вы используете FOSUserBundle, и вы хотите отключить защиту CSRF только в форме входа в систему, выполните следующие шаги.

Шаг 1) Создайте собственный пакет пользователя и файл Security Controller

Чтобы перегрузить SecurityController, встроенный в FOSUserBundle, вы должны сначала создать свой собственный пакет.

Итак, создайте файл под названием app/src/{YourApp}/UserBundle/Controller/SecurityController.php Вы должны расширить исходный класс 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 (security.yml)

Убедитесь, что вы закомментируете существующую строку "csrf_provider:" в security.yml:

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

Шаг 3) Отмените маршрутизацию для контроллера безопасности FOSUserBundle (routing.yml)

В 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: вам нужна часть "exose: true"! В противном случае вы получите ошибку JavaScript из пакета fos js routing.

Это должно сделать это!

Ответ 4

Мне пришлось переопределить FOSUserBundle 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,
    ));