"会话开始后无法设置会话ID"在Behat测试中生成csrf令牌时

时间:2015-11-18 23:36:06

标签: symfony session behat csrf-protection

我试图测试具有错误权限的用户在浏览路径中包含csrf令牌的页面时看到正确的响应。

我已经使用' security.csrf.token_manager'添加了一个Behat上下文步骤来创建csrf令牌,然后在路径中使用此令牌访问该页面,我得到一个&# 34;会话开始后无法设置会话ID" 500错误。

有人可以告诉我我做错了什么,或者我如何解决这个问题,好吗?

/**
 * @When /^I go to the application admin archive page for "(?P<status>[^"]*)" application (?P<number>\d+) with a valid token$/
 *
 * @param string $status
 * @param int    $number
 */
public function iGoToTheApplicationAdminArchivePageForApplicationWithAValidToken($status, $number)
{
    $tokenManager = $this->kernel->getContainer()->get('security.csrf.token_manager');
    $token        = $tokenManager->getToken(ApplicationAdminController::CSRF_ARCHIVE);
    var_dump($token);

    $this->visitAdminPage('archive', $status, $number, ['token' => $token]);
}

2 个答案:

答案 0 :(得分:0)

您获得的具体错误消息似乎是bug in symfony2的结果。尝试应用maryo关于扩展MockFileSessionStorage类的建议,并在尝试设置它之前检查id是否为空:

public function setId($id)
{
    if ($this->id !== $id) {
        parent::setId($id);
    }
}

然后,您可以在创建客户端后执行类似的操作,在功能测试中使用此固定类:

$client->getContainer()->set('session', new Session(new FixedMockFileSessionStorageHelper()));

答案 1 :(得分:0)

此刻我仍然遇到此错误。我通过检查

的env文件配置修复了这个问题
framework:
    test: ~
    session:
        storage_id: session.storage.mock_file
    profiler:
        collect: false

我在框架部分

下找到了此配置
framework:
    session:
        storage_id: session.storage.mock_file
    profiler:
        collect: false

所有您需要做的只是删除此行测试:〜 如下:

php bin/console cache:clear --env=test --no-debug

然后通过

清除缓存
base64File

刷新并享受;)