如何使用Cake的数据库会话处理在两个域之间共享会话?

时间:2012-08-27 23:47:47

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

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

Cake的本机数据库支持的会话处理似乎很缺乏,但我讨厌破解它。它似乎不支持从服务器A(存在于数据库中)传递活动会话ID(sid),然后在具有该ID的服务器B上启动新会话(并且数据完整)。

这是我得到的地方:

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

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

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

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

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

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

这是一个cookie问题吗?

我不确定还剩下什么,但绕过整个蛋糕范例。似乎Cake开发人员没有设计会话处理来帮助重新建立围绕多个域的现有会话。我认为这是数据库会话处理程序的主要好处之一。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我在服务器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会话处理的简洁的便利包装器。 / p>

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