Есть ли способ принудительно установить токен CSRF в форме входа в Symfony - PullRequest
0 голосов
/ 19 февраля 2019

Очевидно, я бы хотел установить токен CSRF в форме входа в систему.Предположим, что я не добавляю токен CSRF в форму входа и отправил форму.На данный момент мой запрос таков: ответ должен быть возвращен как отклоненный, чтобы я не добавил токен CSRF.

Как я могу это сделать или я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы можете добавить CsrfTokenManagerInterface в Controller и использовать его в своем логине , как показано в следующем примере:

SecurityController.php

class SecurityController extends Controller
{

    /** @var CsrfTokenManagerInterface */
    private $tokenManager;

    public function __construct(CsrfTokenManagerInterface $tokenManager = null)
    {
        $this->tokenManager = $tokenManager;
    }

    /**
    * @Route("/login", name="login")
    *
    * @param Request $request
    */
    public function login(Request $request)
    {
        // Get the login error if exists
        $error = $this->get('security.authentication_utils')->getLastAuthenticationError();

        // Last username entered by user
        $lastUsername = $this->get('security.authentication_utils')->getLastUsername();

        $csrfToken = $this->tokenManager
            ? $this->tokenManager->getToken('authenticate')->getValue()
            : null;

        if (null === $csrfToken) {
            //your exception
        }

        return $this->renderLogin([
            'last_username' => $lastUsername,
            'error' => $error,
            'csrf_token' => $csrfToken
        ]);
    }
}
0 голосов
/ 19 февраля 2019

Конечно, вы можете.Вам просто нужно создать и вывести токен CSRF:

<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">

Обычно это все, что вам нужно, потому что https://github.com/symfony/security/blob/master/Http/Firewall/SimpleFormAuthenticationListener.php#L59-L60 проверяет токен автоматически.Вам нужно в точности указать _csrf_token в качестве имени поля и authenticate в качестве имени токена.

Вы можете предварительно настроить его, если хотите:

# app/config/security.yml
security:
    # ...

    firewalls:
        secured_area:
            # ...
            form_login:
                # ...
                csrf_parameter: YOUR_csrf_token
                csrf_token_id: YOUR_authenticate

Осторожно!Эта форма слушателя входа устарела с 4.2.Вот пример с gurad https://symfony.com/doc/current/security/form_login_setup, который рекомендуется использовать.

Cheers!

...