显然,我想强制在登录表单中设置 CSRF 令牌。假设我没有在登录表单中添加 CSRF 令牌并且我已经提交了表单。此时,我的请求是,响应必须返回为拒绝,这样我就没有添加 CSRF 令牌。
我该怎么做,或者我可以这样做吗?
显然,我想强制在登录表单中设置 CSRF 令牌。假设我没有在登录表单中添加 CSRF 令牌并且我已经提交了表单。此时,我的请求是,响应必须返回为拒绝,这样我就没有添加 CSRF 令牌。
我该怎么做,或者我可以这样做吗?
你当然可以。您只需创建和输出 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示例。
干杯!
您可以在您的中注入CsrfTokenManagerInterface并在您的登录Controller
方法中使用它,如下例所示:
安全控制器.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
]);
}
}