【问题标题】:Symfony: Storing sessions in JSONSymfony:以 JSON 格式存储会话
【发布时间】:2018-04-25 10:55:33
【问题描述】:

在我的 Symfony 应用程序中,我使用 NodeJS 和 socket.io 来构建聊天功能并发送实时通知。为此,我使用 Redis 以 JSON 格式存储会话,以便在 Javascript 中轻松解析。

public function read($session_id) {
    $tmp = $_SESSION;
    $_SESSION = json_decode($this->client->get(self::PREFIX . $session_id), true);

    if (isset($_SESSION) && !empty($_SESSION) && $_SESSION != null) {
        $encoded_data = session_encode();
        $_SESSION = $tmp;

        return $encoded_data;
    }

    return '';
}

public function write($session_id, $session_data) {
    $tmp = $_SESSION;
    session_decode($session_data);
    $decoded_data = $_SESSION;
    $_SESSION = $tmp;

    $this->client->setex(self::PREFIX . $session_id, $this->ttl, json_encode($decoded_data));

    return true;
}

问题是会话没有被正确编码,尤其是用户信息(身份验证部分)。

Symfony 存储会话:

"_sf2_attributes|a:2:{s:18:\"_csrf/authenticate\";s:43:\"Fc3iwpceqYiNmAn1FbUyQyaEPdu7qbI_unu5dBAgaTg\";s:14:\"_security_main\";s:456:\"C:74:\"Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken\":368:{a:3:{i:0;N;i:1;s:4:\"main\";i:2;s:328:\"a:4:{i:0;C:21:\"AppBundle\\Entity\\User\":127:{a:5:{i:0;i:52;i:1;s:12:\"user123\";i:2;s:60:\"$2y$13$mgT//whXPFsj7b0XCAWhdeiC2oGZqojiAzky.6sThuN6MI9zALt1.\";i:3;i:1;i:4;i:1;}}i:1;b:1;i:2;a:1:{i:0;O:41:\"Symfony\\Component\\Security\\Core\\Role\\Role\":1:{s:47:\"\x00Symfony\\Component\\Security\\Core\\Role\\Role\x00role\";s:9:\"ROLE_USER\";}}i:3;a:0:{}}\";}}\";}_sf2_flashes|a:0:{}_sf2_meta|a:3:{s:1:\"u\";i:1524485577;s:1:\"c\";i:1524485576;s:1:\"l\";s:1:\"0\";}"

JSON 编码会话:

"{\"_sf2_attributes\":{\"_csrf\\/authenticate\":\"hvNt4SQIm7IArE57JgHyuVSCLlt4hrw1D-PVC_kBfKA\",\"_security_main\":\"C:74:\\\"Symfony\\\\Component\\\\Security\\\\Core\\\\Authentication\\\\Token\\\\UsernamePasswordToken\\\":368:{a:3:{i:0;N;i:1;s:4:\\\"main\\\";i:2;s:328:\\\"a:4:{i:0;C:21:\\\"AppBundle\\\\Entity\\\\User\\\":127:{a:5:{i:0;i:52;i:1;s:12:\\\"user123\\\";i:2;s:60:\\\"$2y$13$mgT\\/\\/whXPFsj7b0XCAWhdeiC2oGZqojiAzky.6sThuN6MI9zALt1.\\\";i:3;i:1;i:4;i:1;}}i:1;b:1;i:2;a:1:{i:0;O:41:\\\"Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\\":1:{s:47:\\\"\\u0000Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role\\u0000role\\\";s:9:\\\"ROLE_USER\\\";}}i:3;a:0:{}}\\\";}}\"},\"_sf2_flashes\":[],\"_sf2_meta\":{\"u\":1524651793,\"c\":1524651793,\"l\":\"0\"}}"

Symfony 不使用 PHP 内置的存储机制吗?我在这里做错了什么?

非常感谢任何帮助。

【问题讨论】:

标签: php json symfony session redis


【解决方案1】:

有一种更简单的存储在会话中的方法:在您的客户端实体中实现 \Serializable,然后编写序列化和反序列化函数示例:

class Client implements \Serializable{
public function serialize()
{
    return serialize([
        $this->id,
        $this->name,
        $this->color
    ]);
}

public function unserialize($serialized)
{
    list (
        $this->id,
        $this->name,
        $this->color
        ) = unserialize($serialized);
}}

之后你几乎可以在任何地方这样使用它

$this->session->set('client',$client);
$this->session->get('client');

添加您想要序列化和反序列化函数的任何其他必填字段

【讨论】:

  • 在用户实体上实现 \Serializable 类?
  • 确实,因为你用了客户端,我才加了客户端
  • 实现可序列化到您想要存储在会话、用户、客户端等中的任何实体...
  • $this->client 这里是redis客户端(predis)。这将如何解决我在 javascript 中读取会话数据的实际问题?
  • 是的,我的错,忘了redis。然后是的实现可序列化到用户实体,这应该解决它
猜你喜欢
  • 2021-10-23
  • 2012-06-16
  • 2019-02-21
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多