如何与Cake';在两个域之间共享会话;的数据库会话处理


How do I share a session across two domains with Cake's database session handling?

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

Cake的原生DB支持的会话处理似乎很缺乏,但我不想再加上它。它似乎不支持从服务器A(数据库中存在)传递活动会话ID(sid),然后在服务器B上使用该ID(和数据完整)启动新会话。

这是我得到的:

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

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

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

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

我重新阅读了会议,以确保它"成功"。

但是,当我导航到一个新页面时,活动的sid只是会恢复到一个完全不同的sid,该sid在其他页面加载时保持不变(即使我刷新了从服务器a重新建立sid的页面)。

这是饼干的问题吗?

我不知道该做什么,但要绕过整个蛋糕模式。Cake开发人员似乎没有设计会话处理来帮助围绕多个域重新建立现有会话。我认为这是DB会话处理程序的主要优点之一。

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

我在服务器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会话处理的方便包装器。

我甚至不需要解析会话DB表中的伪序列化会话数据和所有这些jazz——完全没有必要。上面的代码做到了:跨域会话共享。