如何在Symfony中手动管理CRSV令牌?

时间:2015-04-26 20:30:51

标签: security symfony

我试图在没有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%

1 个答案:

答案 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');
}