Есть ли способ принудительно установить токен CSRF в форме входа в Symfony
Очевидно, я бы хотел установить токен CSRF в форме входа в систему. Предположим, что я не добавляю токен CSRF в форму входа и отправил форму. На данный момент мой запрос таков: ответ должен быть возвращен как отклоненный, чтобы я не добавил токен CSRF.
Как я могу это сделать или я могу это сделать?
2 ответа
Что вы можете. Вам нужно просто создать и вывести токен CSRF:
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
Обычно это все, что вам нужно, потому что https://github.com/symfony/security/blob/master/Http/Firewall/SimpleFormAuthenticationListener.php проверяет токен автоматически. Нужно поставить точно _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 который рекомендуется использовать.
Ура!
Вы можете вставить 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
]);
}
}