繁体   English   中英

多个实例随机注销用户

[英]Multiple instances randomly signs out user

我正在Appfog上运行Yii应用程序。 每当我尝试拥有多个实例时,就不再保持登录状态。

我知道多个实例需要用于会话的共享存储,而我已经使用EDMSHttpSession实现了这一点。 它确实可以在localhost上运行,也就是说,我可以登录,重新启动Apache并保持登录状态。此外,如果我删除了数据库中的会话记录,就退出了。 这使我得出结论,PHP正在使用数据库来存储会话。

我不明白为什么我的会话共享存储在Appfog上不起作用, 我想提出有关调试方法的建议。

一些更多的背景信息:

  • 我使用cookie进行自动登录。 它们的有效期应为30天(根据Chrome检查器的说法,有效期为30天),但永远不会超过几个小时(我认为是浏览器会话),而不是在localhost上,而不在Appfog上。
  • 启用多个实例并启用自动登录后(即我单击“记住我”),通常在刷新2或3页后,我仍然会被随机踢出。 据我了解,无论服务器会话如何,cookie都应该自动登录?
  • 在Appfog上,我有一个SSL端点,在localhost上,我没有。
  • 我检查了我在Appfog上的共享会话存储是否正在获取新的会话(在数据库表中查找)

更新:

我进行了一些测试,也许我的结果将有助于理解。

我清除所有Cookies并重新启动Appfog应用程序。 我登录,然后选中“记住我”。 现在,以下响应Set-cookie标头为:

Set-Cookie:PHPSESSID=vrfoi0o15v3qps2644uqtvkfa1; path=/  
Set-Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; path=/  
Set-Cookie:73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D; expires=Sun, 09-Jun-2013 08:32:24 GMT; path=/

在后续请求中,请求Cookie头是:

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D

我使用"db38s1k1vp5ngll837ac0vh0u7"在数据库中找到我的会话。 该行如下所示(请注意,在数据库中找不到vrfoi0o15v3qps2644uqtvkfa1 ):

{
  "_id" : ObjectId("518cb0981045979e06000000"),
  "data" : "73dfaf673b71b1f92d34b8ab63dab17b__id|s:24:\"5087ea0b3145a75545000000\";73dfaf673b71b1f92d34b8ab63dab17b__name|s:22:\"demo@playbackenergy.se\";73dfaf673b71b1f92d34b8ab63dab17b__states|a:0:{}73dfaf673b71b1f92d34b8ab63dab17brole|s:4:\"demo\";",
  "expire" : 1368176186,
  "id" : "db38s1k1vp5ngll837ac0vh0u7"
}

现在,我再次重新启动Appfog应用,并尝试导航到应用中的另一个页面。现在,我退出了。

重定向到登录页面之前的请求Cookie标头是(与之前相同):

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D

您仅询问有关调试的建议,因此您可以进行以下操作:

  • 向每个实例布局文件中添加不同的隐藏字符串,以便您可以看到哪个实例满足了当前请求
  • 检查浏览器中请求/响应标头中的cookie,以了解是否每个请求都发送了相同的会话ID,以及服务器是否发送了新的会话ID。

这可以帮助您找出丢失会话的情况。

UPDATE

  • 找出会话是否真的被破坏了,或者Yii是否只是注销了您。 为此,请以访客用户身份向会话中写入一些内容,然后尝试在重新加载时丢失此信息。
  • 禁用allowAutoLogin并查看它是否现在可以正常工作。

最后,感谢MichaelHärtl的建议,我已经成功调试了此问题。

我不得不修理两件事

1)在protected / config / main.php中指定一个应用程序ID

array(
    'name' => 'My App',
    'id' => 'yourdomain',
    ...,
)

如果您不这样做,则多个实例将具有不同的ID。 由于Yii使用app-id的哈希值为会话变量添加前缀,因此即使您拥有共享的会话存储空间,它也可以在不同的实例之间共享。 这个Yii文章对其进行了更深入的解释: http : //www.yiiframework.com/wiki/135/single-sign-on-across-multiple-subdomains/

2)使用CDN进行资产共享共享。 显然,此实例之间的资产文件夹(例如3f4ad45)可能有所不同,因此您必须使用共享存储。 我将扩展名http://www.yiiframework.com/extension/s3assetmanager/用于管理资产,并将扩展名https://github.com/aarondfrancis/yii-CMemCacheSASL用于缓存(MemCachier)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM