提取序列化的用户会话数据

extract serialized user session data

我有一个 symfony 1.4 应用程序,我刚刚将其更改为在 mysql 数据库中的会话 table 中保存会话数据。

这里是序列化的 mysql table session_data 字段的示例。

symfony/user/sfUser/lastRequest|i:1447469750;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:2:
{s:30:"symfony/user/sfUser/attributes";
a:3:{s:12:"current_page";
s:6:"splash";s:15:"logged_in_token";
s:31:"e9psz6e3iko4scsk0c4k4wckwk4k0k4";
s:25:"available_credits_session";
i:0;}s:19:"sfGuardSecurityUser";
a:1:{s:7:"user_id";s:1:"1";}}
symfony/user/sfUser/culture|s:2:"en";

我想从这个序列化数据中提取两条信息。

1) 我正在使用的 logged_in_token id 所以用户的真实用户 id 不会暴露。

2) user_id 这是实际的用户 ID。

我需要此信息的原因是应用程序要求他们一次只能有一个活动会话。

因此,如果会话中有两个相同的用户 ID table,我将使用此信息注销或暂停上一个会话。

似乎是序列化数据的特定"symfony way"。

任何关于如何在节点或 javascript 中提取此信息的想法将不胜感激

此数据的序列化方式并非特定于 symfony,而是特定于 php。根据 php.ini 中的 session.serialize_handler 设置,php 以不同的方式序列化会话数据。该设置的默认值只是 php ,您的情况似乎使用了它。

我在 php 中使用以下方法来转义此编码 - 它输出带有数据的常规数组。这里没有 php 特定内容,因此您可以轻松地将其移植到 javascript: (但是最好的解决方案是在将此数据保存到数据库之前执行 "unescaping",然后您不需要在 javascript 端执行此操作)

function unserializePhp($sessionData)
{
    $returnData = array();
    $offset = 0;
    while ($offset < strlen($sessionData)) {
        if (!strstr(substr($sessionData, $offset), '|')) {
            throw new Exception('invalid data, remaining: ' . substr($sessionData, $offset));
        }
        $pos = strpos($sessionData, '|', $offset);
        $num = $pos - $offset;
        $varname = substr($sessionData, $offset, $num);
        $offset += $num + 1;
        $data = unserialize(substr($sessionData, $offset));
        $returnData[$varname] = $data;
        $offset += strlen(serialize($data));
    }

    return $returnData;
}