单个登录多个子域

时间:2015-08-29 23:43:27

标签: php login single-sign-on

我需要在共享同一顶级域的不同子域上托管多个不同的服务,我想集中登录过程。

想法是:

site1.tld.com 
site2.tld.com 
site3.tld.com 
siteX.tld.com 
login.tld.com

并将用户重定向到login.tld.com。然后,一旦记录,他们就可以访问这些服务。

PHP实现和保护的最佳方式是什么?

是否可以不存储本地cookie并保持会话开放?

添加更多详情

我需要用户在关闭浏览器后也能记住连接。我可以完全访问服务器,因此我可以根据需要配置php.ini

1 个答案:

答案 0 :(得分:2)

如果您不想设置任何本地cookie,则需要坚持使用会话。跨子域进行会话的工作方式与仅在一个域上有所不同。让我们开始吧。

首先,我们需要为会话Cookie添加新的session_name()。我们需要这样做,因为在设置cookie参数之前必须定义会话名称。这会将旧会话名称存储在$old_name下,并将会话名称更新为“some_name”:

$old_name = session_name("some_name");

接下来,我们必须使用session_set_cookie_params()设置会话Cookie参数。这是我们告诉服务器会话cookie将在哪里运行的地方:

session_set_cookie_params(0, '/', '.tld.com');

通过在第三个参数(域“tld.com”)前面加一个点,我们确保会话cookie在所有子域上都可见。作为替代方案,您还可以使用:

ini_set('session.cookie_domain', '.tld.com');

最后,我们需要使用session_start()在我们的脚本中开始或恢复我们的会话:

session_start();

总而言之,你应该在每个使用你的会话的脚本之上:

<?php

$old_name = session_name("some_name");
session_set_cookie_params(0, '/', '.tld.com');
//ini_set('session.cookie_domain', '.tld.com'); //Uncomment and comment above line if prefered.
session_start();

作为旁注,我应该包括在大多数共享主机提供商上不允许设置php.ini参数。此脚本假定您拥有对服务器的完全访问权限,或者至少是愿意让您更改这些设置的提供商。