Thelia / Symfony登录错误:会话配置错误导致“无效的CSRF令牌”

时间:2016-11-01 16:17:49

标签: symfony session

我手动安装Thelia(通过压缩存档)并在Vagrant框中设置我的本地服务器。现在当我以安装期间创建的管理员用户身份登录时,我得到:

  

请检查您的输入:数据丢失或无效:CSRF令牌无效。请尝试重新提交表单。

我将问题追溯到Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage班:$storage->hasToken()正在返回false。然后我发现我手动设置的$_SESSION个变量都没有。例如,我分别在两个连续的表单帖子中插入代码中的以下每一行:

die($_SESSION['foo'] = 'bar'); // output 'bar'
die($_SESSION['foo']); // Notice: Undefined index: foo

此外,如果我在异常生成错误消息之前在die($data['$this->fieldName']);内添加CsrfValidationListener,我会得到一些确定,因为看起来像是一个打印到屏幕上的安全令牌。所以我很确定令牌正在创建;它只是没有进入会议。

我知道会话正在我正在同一个Vagrant框中运行的其他网站上正常运行。所以我想知道的是,如果Thelia在后台配置一个会话处理程序,试图写入一个没有写入权限的文件,或者沿着这些行的东西?为此,我尝试了chmod 777 project/path/local/session,但似乎没有任何效果。

我还通过创建local / config / config.yml文件尝试了这个question的解决方案:

# local/config/config.yml
framework:
  session:
    save_path: /var/lib/php5/sessions/ # <- gleaned from phpinfo()

同样的错误。

Thelia是否默认使用基于文件的会话处理?如果是这样,它在哪里保留它们,如果不在本地/会话/?如果没有,我需要做什么才能使会话工作? (修改后的问题见下文)

更新:我在另一个Vagrant框中安装了Thelia,并开始在Apache日志中收到这些错误:

PHP Warning:  SessionHandler::read(): Session data file is not created by your uid in /vagrant/projects/thelia/core/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php on line 69
PHP Warning:  SessionHandler::write(): Session data file is not created by your uid in /vagrant/projects/thelia/core/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php on line 77

正在运行strace确认它正在尝试在本地/会话下打开该文件:

open("/vagrant/projects/thelia//local/session//sess_u32o90k65sesi763rddb9lk1s2", O_RDWR|O_CREAT|O_NOFOLLOW, 0600) = 21

我可以让会话数据持久化的唯一方法是将覆盖硬编码到Thelia\Model\ConfigQuery,它负责告诉Thelia在哪里读/写会话数据:

class ConfigQuery extends BaseConfigQuery
{

    public static function read($search, $default = null)
    {
        if($search === 'session_config.save_path') return '/var/lib/php5/sessions/';
        ...
    }
    ...
}

所以现在我的问题是:我在哪里可以实际配置Thelia来执行此操作,以便我不必破解捆绑代码?

1 个答案:

答案 0 :(得分:0)

您只需将此行添加到config表:

INSERT INTO `config` (`name`, `value`, `secured`, `hidden`, `created_at`, `updated_at`) VALUES ('session_config.save_path', '/var/lib/php5/sessions/', 0, 0, NOW(), NOW())