【问题标题】:How can I unserialize Symfony session from the file?如何从文件中反序列化 Symfony 会话?
【发布时间】:2014-04-02 08:03:54
【问题描述】:

开发环境中app/cache/dev/sessions/sess_{session_id} 文件中的 Symfony 存储会话。该文件的内容类似于:

_sf2_attributes|a:0:{}_sf2_flashes|a:0:{}_sf2_meta|a:3:{s:1:"u";i:1396424236;s:1:"c";i:1396360957;s:1:"l";s:1:"0";}bbb|i:222;IsAuthorized|b:1;

当我尝试使用 unserialize() 函数对其进行反序列化时 - 我得到 FALSE

如何取消序列化?

【问题讨论】:

  • symfony 自己提供了序列化和反序列化,如果你尝试获取内容而不反序列化呢?
  • 我尝试在框架后面使用这个 Symfony 会话,我需要获得 IsAuthorized

标签: php session symfony serialization


【解决方案1】:

您可以只使用标准的 PHP 会话机制。您需要设置存储会话的目录 (app/cache/dev/sessions)。然后调用标准函数session_start() 将使用来自相应文件的所有未序列化数据填充$_SESSION 变量。

例如,您可以使用以下代码:

ini_set('session.save_handler', 'files');
ini_set('session.save_path', 'path/to/your/site/folder/app/cache/dev/sessions');
session_start();

当您需要在 Symfony 框架后面处理会话时(根据 OP 需要),可以使用上述方式。要使用 Symfony 的会话机制,您应该使用 Session 对象,它将为您提供所有需要的信息:

use Symfony\Component\HttpFoundation\Session\Session;

$session = new Session();
$session->start();

$session->all(); // will return unserialized array of parameters

【讨论】:

  • 我更新了我的答案给你举个例子。您可以在这里找到所有您需要的内容:php.net/manual/en/book.session.php
  • 谢谢!我会理解的
  • 这是完全错误的答案,没有直接回答如何反序列化 Symfony 的会话内容以及使用 Symfony 的不良做法。
  • @GrzegorzTomasiak,你是绝对正确的。但是 OP 还有另一个问题:他不想使用 Symfony 组件来处理会话。他只需要通用的方式来使用 Symfony 而不是使用它来处理会话。但我更新了我的答案,以免混淆其他人。
  • 但我想知道如何反序列化 symfony 会话数据
【解决方案2】:

您可以通过分解和删除有效的不可序列化字符串之前的_something|(和类似的起始“标签”)来反序列化它。例如:

_sf2_attributes|a:0:{}
_sf2_flashes|a:0:{}
_sf2_meta|a:3:{s:1:"u";i:1396424236;s:1:"c";i:1396360957;s:1:"l";s:1:"0";}
bbb|i:222;
IsAuthorized|b:1;

你可以把它变成:

a:0:{}
a:0:{}
a:3:{s:1:"u";i:1396424236;s:1:"c";i:1396360957;s:1:"l";s:1:"0";}
i:222;
b:1;

您应该能够将 unserialize() 分别应用于生成的 5 个字符串。

【讨论】:

    【解决方案3】:

    最新版本的 Symfony 更新。

    可以选择从序列化的会话数据字符串中反序列化UsernamePasswordToken 类。

    $exploded = explode('|', $sessionData);
    $deserialized = unserialize($exploded[1]);
    $securityMain = $deserialized['_security_main'];
    
    /** @var \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken $usernamePasswordToken */
    $usernamePasswordToken = unserialize($securityMain);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 2014-12-12
      • 1970-01-01
      • 2015-03-31
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多