带子域的Zend身份验证问题

时间:2009-11-23 06:39:36

标签: php zend-framework login

我正在使用undntu上的zend框架,php,mysql进行项目。

我在本地计算机上创建了主机名 test.dev 并使用了zend身份验证。当使用zend身份验证对用户进行身份验证时,我为登录的用户ID设置会话变量。我在不同的页面上使用此会话变量(userid)来确保身份验证。

问题: 现在我必须创建一个子域。我在本地计算机上创建了一个新主机名 mypage.test.dev 。两个主机名都指向同一目录,例如/ var / www / test / public。但是当我登录 test.dev 时,我必须再次登录子域 mypage.test.dev 。在 mypage.test.dev 上,甚至无法访问 test.dev 的会话变量。

如何使用一次登录登录所有子域?

感谢。

3 个答案:

答案 0 :(得分:2)

会话变量特定于每个特定域地址存储。因此,如果网站编码不佳并且您登录http://mydomain.com然后以http://www.mydomain.com访问该网站,则会遇到相同的错误。

一种可能的解决方案是设置一个Web服务,允许您访问其他域并检索任何存储的会话变量以及对用户进行身份验证。例如,如果我登录test.dev然后转到mypage.test.dev,mypage.test.dev会向test.dev/auth-service/发出一个调用来验证用户身份,如果是成功,然后返回所有存储的会话变量,以便它们可以由mypage.test.dev存储。

或许更简洁的方法是始终只从一个域或另一个域访问会话数据,并始终严格通过Web服务访问它,以便会话数据的接口在两个站点之间保持一致。这确实提供了可能的性能,因为直接访问会话而不是通过Web服务显然更快。

答案 1 :(得分:1)

答案 2 :(得分:1)

过了一段时间,我得到了解决方案。

我在 config.ini

中添加了以下行
session.cookie_domain = .test.dev

然后将以下行添加到 Bootstrap.php

Zend_Session::setOptions( $this->getOption('session') );

和会话变量适用于test.dev的所有子域