【问题标题】:How do I share a session across two domains with Cake's database session handling?如何使用 Cake 的数据库会话处理跨两个域共享会话?
【发布时间】:2012-08-27 23:47:46
【问题描述】:

我非常接近一个优雅的跨域会话共享解决方案(我很乐意将其发布到 CakePHP 社区),但我需要最后一点推动才能完成它。

Cake 的本地 DB 支持的会话处理似乎很缺乏,但我讨厌在它之上进行破解。它似乎不支持从服务器 A(存在于数据库中)传递活动会话 ID (sid),然后在服务器 B 上使用该 ID(和完整的数据)启动一个新会话。

这是我得到的:

我设置 Security = Low,并测试单服务器登录等以确保会话正常运行。检查。

我成功地将 sid 字符串从服务器 A 传递到服务器 B。现在在服务器 B 上...

我运行 CakeSession::id($sid_from_server_a)。

我解析出会话数据库表中的数据字段,并通过$this->Session->write('blah','value')将它们存入活动会话中。

我重新阅读了会话以确保它“完成”。

但是当我导航到一个新页面时,活动 sid 只是快速回到一个完全不同的 sid,该 sid 与其他页面加载保持相同(即使我刷新了从服务器 A 重新建立 sid 的页面)。

这是 cookie 的问题吗?

我不确定除了绕过整个 Cake 范式还能做什么。似乎 Cake 开发人员没有设计会话处理来帮助围绕多个域重新建立现有会话。我认为这是 DB 会话处理程序的主要优点之一。

【问题讨论】:

  • 两者。每台服务器都在不同的域中。

标签: php session cakephp cakephp-2.0 single-sign-on


【解决方案1】:

这听起来像是一个 cookie 问题,您需要一个 cookie 来存储您想要返回的会话信息。据我所知,没有其他方法可以回忆那种类型的会话信息。我不确定你的项目需要你保存什么,但是如果没有一些信息,服务器别无选择,只能在跨域时创建一个新会话。祝你好运。

【讨论】:

    【解决方案2】:

    我在服务器 B 上要做的就是正确地重新初始化会话。非常基本:

    session_write_close(); // close any session that has already initialized
    CakeSession::id($sid_from_server_a); // or: session_id($sid_from_server_a);
    session_start();
    

    在此之前我假设我需要的只是第二行,在 CakeSession 包装器中设置新的 sid 会提示会话开始。但它更类似于以旧的 PHP 方式运行 session_id($some_sid) ......您可以这样做以在实际启动之前设置会话。

    一般来说,我有一些模糊的概念,即 CakePHP 会在我想要的时候自动启动会话,但真正扫描 CakeSession 类表明它并没有做太多 - 它是一个用于原生 PHP 会话处理的隐蔽方便的包装器。

    我什至不必解析会话数据库表中的伪序列化会话数据和所有爵士乐——完全没有必要。上面的代码可以解决问题:跨域会话共享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2012-10-05
      • 2011-02-26
      • 2010-09-21
      • 2016-08-01
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多