2015-08-29 98 views
1

我需要在共享相同頂級域的不同子域上承載多個不同服務,並且我想集中登錄過程。多個子域的單點登錄

當時的想法是有:

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

而且用戶重定向到login.tld.com。然後,一旦登錄,他們就可以訪問這些服務。

PHP中實現和保護的最佳方式是什麼?

是否有可能不存儲本地cookie並保持會話打開?

增加更多的細節

我需要的用戶也必須記住的連接,他關閉瀏覽器後的可能性。我可以完全訪問服務器,因此我可以根據需要配置php.ini

+0

你可以設置一個cookie來跨度子域 –

+0

http://stackoverflow.com/questions/18492576/share-cookie-between-subdomain-and-domain – DeDee

回答

1

如果您不想設置任何本地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'); 

由第三paramenter(域「tld.com」),以點之前,我們需要確保讓會話cookie將會對所有可見子域。作爲替代方案,你也可以使用:

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

最後ofcourse我們需要啓動或在我們的腳本恢復我們的會議與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參數不允許在大多數共享主機提供商。此腳本假設您已完全訪問您的服務器,或者至少有一個願意讓您更改這些設置的提供商。