这就是事情:
我在服务器1中有一个网站A,一个基于CakePHP 2的网站,没有任何登录系统。
我在服务器2中也有网站B,另一个CakePHP网站具有其登录系统(如果重要的话,使用CakePHP的Auth获取更多详细信息),在第一页中有一个用户可以输入的登录表单用于访问它的登录名/密码。
所以现在我需要做的是在网站A中添加一个登录表单,将用户登录到网站B(就好像他们使用了网站B中的表格一样)。
这可能吗?如果是这样,我应该采取什么方法来安全地做到这一点? (我的意思是没有明确地公开用户凭证)。
答案 0 :(得分:0)
我假设您正在这样做,以便您可以在多个站点之间进行,但只能登录一次?我想出了一种方法,只要网站共享域,但通过让它们共享会话来托管在不同的子域上。这仅适用于共享域的网站的原因是因为两个完全不相关的网站无法共享cookie,这是让他们共享会话所必需的。
请注意,由于您的目标是让两台服务器完全共享其会话,因此您会遇到一些问题,例如,两个服务器上都会出现一个站点的flashmessages。我最终扩展了Session组件,以便它会自动附加到具有前缀的所有会话变量,以指定会话变量属于哪个服务器。
以下是步骤概述:
登录服务器需要能够托管共享会话,可能是通过memcache的会话保存处理程序,您需要在两台服务器上安装。点击此处了解详情:http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/
登录服务器的站点将需要登录系统的所有常规内容,但您还需要设置服务器,以便它将使用共享内存缓存会话而不是正常的保存会话方式。安装memcache后的示例,添加到其php.ini文件:
session.save_handler = memcache
session.save_path = "tcp://[login server ip]:11211"
其他服务器的站点还需要使用存储在登录服务器上的共享内存缓存会话,因此请按照与登录服务器相同的方式配置其php.ini。然后,在此站点上设置Auth组件,以便它需要登录,但实际登录时,将它们重定向回登录服务器。
在两台服务器上,在bootstrap.php中,添加行ini_set('session.cookie_domain', '.' . ROOT_DOMAIN);
其中根域是两者都具有的根域。因此,如果您使用的是test.com和subdomain.test.com,则ROOT_DOMAIN将为“test”。这样,网站也将分享他们的会话cookie。
确保两台服务器都设置为同一时间。如果他们的时间不匹配,您可能会随机丢失会话,因为其中一个服务器会认为会话比其他服务器更老,因此会删除它,因为它认为会话太旧了。