我试图在没有FormType的情况下使用CRSF令牌管理。所以在twig模板中我只是用它来生成一个令牌:
{{ csrf_token( inception_inscription ) }}
在控制器中我试着这个:
$tokenManager = $this->get('security.csrf.token_manager');
$token = $request->get('token');
inception = $this->container->getParameter('crsf_inscription_inception');
if (!$tokenManager->isTokenValid($tokenManager->getToken($inception, $token))) {
throw new HttpException(400, 'Invalid token');
}
但实际上方法isTokenValid总是返回true。我可以强制$ token vaiable到我想要的,它永远不会错,所以验证是无用的。
当我逐步调试时,我走过一个Symfony \ Component \ Security \ Csrf :: getToken(),该方法正在测试:($ this-> storage-> hasToken($ tokenId)) whic总是返回false并强制进程生成一个新的Token。
我真的不知道它是如何运作的。 这是关于我的代码的矿石信息: Symfony 2.6.x
framework:
secret: "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form:
csrf_protection:
enabled: true
field_name: token_my
csrf_protection:
enabled: true
validation: { enable_annotations: true }
templating:
engines: ['twig']
#assets_version: SomeVersionScheme
default_locale: "%locale%"
trusted_hosts: ~
trusted_proxies: ~
session:
handler_id: ~
name: 'my'
fragments: ~
http_method_override: true
# Twig Configuration
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
globals:
inception_inscription: %crsf_inscription_inception%
答案 0 :(得分:4)
根据我的理解,$ tokenManager-> getToken($ tokenId)始终生成一个新的有效令牌。您可能会检查提供的令牌,例如:
$tokenManager = $this->get('security.csrf.token_manager');
$tokenId = $this->container->getParameter('crsf_inscription_inception');
$tokenValue = $request->get('token');
$token = new CsrfToken($tokenId, $tokenValue);
if (!$tokenManager->isTokenValid($token)) {
throw new HttpException(400, 'Invalid token');
}