2014-02-26 47 views
-3

我正在嘗試像Google一樣創建跨域簽名。因此,您的youtube,gmail,google +等具有相同的帳戶。但是,有幾個問題令我困惑:SSO /跨域名登錄,本地訪問用戶數據

假設我有5個網站,我不想傳輸任何有關用戶的數據除了他/她的電子郵件,用戶名和密碼。如果我只有1個用戶數據庫而不是5個,每次我調用用戶數據庫來訪問用戶的個人資料圖片,用戶名等時,是否需要調用遠程數據庫?

我一直在想有一個遠程用戶和會話數據庫,所以每個子站點訪問,而不是本地用戶和會話數據庫。但是我的應用程序廣泛使用該表,並且擔心每次從遠程數據庫獲取數據的性能。

如何以一種乾淨的方式實現此目標,以便每個子站點都可以在本地輕鬆訪問用戶信息,並且他們也像Google和其產品一樣共享相同的登錄/註銷過程? (我使用所謂的Yii與MySQL一個PHP框架)


我已經想出了以下解決方案,我張貼作爲一個答案爲好,請指教,如果有任何問題,這件事嗎?謝謝你們的幫助。

  1. 有一個用戶表中的每個子站點,說child1.com & child2.com
  2. 已在父網站超級用戶表,說parent.com
  3. 當用戶登錄到child1.com ,檢查身份,重定向到parent.com/child1進行註冊或登錄。完成後,使用加密的URL重定向到child1以自動登錄用戶。如果用戶的信息已經從父數據庫發生變化,我們可以在這裏將它同步到子數據庫(如果它是一個註冊過程而不是登錄過程,請將user_id,用戶名和電子郵件寫入數據庫,以便您可以訪問本地從child1.com)
  4. 當用戶登錄到child2.com時,它將重定向到parent.com/child2,但是,用戶已經通過了對parent1.com的身份驗證,因此它將用戶重定向到child2而沒有加密的URL,所以child2.com直接登錄用戶。
  5. 對於退出處理,註銷child1.com &捲曲的加密註銷鏈接註銷從其他網站該用戶說child2.com或parent.com
+0

查看** OAuth ** – 2014-02-26 19:23:35

+0

什麼是投票表決? – jackhao

+0

@jackhao:很可能是因爲你的問題太寬泛。它只是無法回答。通過Yii,這將是一些登錄遠程服務和會話處理的混合體。瞭解授權和認證以及兩者之間的差異。 – hakre

回答

1

交談一堆人後,下面的方法似乎有希望。

  1. 有一個用戶表中的每個子站點,說child1.com & child2.com
  2. 已在父網站超級用戶表,說parent.com
  3. 當用戶試圖登錄到child1 .com,重定向到parent.com/child1進行註冊或登錄。完成後,使用加密的URL重定向到child1以自動登錄用戶。如果用戶的信息已經從父數據庫中更改,我們可以在這裏將它同步到子數據庫(如果它是註冊過程而不是登錄過程,請將user_id,用戶名和電子郵件寫入數據庫,以便您可以從本地訪問child1.com)
  4. 當用戶登錄到child2.com時,它將重定向到parent.com/child2,但是,用戶已經通過了對parent1.com的身份驗證,因此它將用戶重定向到child2而無需再次登錄,並且child2。com直接使用來自parent.com的加密URL登錄用戶。
  5. 對於註銷過程中,假定從child1.com用戶註銷,我們會自動捲曲的加密註銷鏈接註銷來自其他網站的這個用戶說child2.com或parent.com
+0

許多移動部件,許多方法可能會蔓延,許多表面區域滲透。不一定致命的實施,但設計聽起來很脆弱。 FWIW,StackExchange似乎完全符合你的描述:也許你可以查詢它是如何實現的。 – bishop

+0

@bishop StackExchange不會共享任何用戶信息,也不會登錄您,您可以使用相同的電子郵件,但您必須手動登錄,我認爲? – jackhao

+0

@bishop你能指出一些重大問題嗎? – jackhao

0

擁有一個遠程數據庫(父服務器)與用戶信息聽起來像最簡單的解決方案。

請記住,PHP會話默認存儲在服務器的本地文件系統上。因此,當您使用網站B的會話數據登錄到網站B時,您未登錄到任何其他網站。

這就是魔術發生的地方。您需要指示PHP使用遠程MySQL數據庫來存儲會話數據,而不是本地計算機的文件系統。一旦建立,這就像魔術般運作。

我做了一個快速的谷歌,並找到了這個網站的說明,爲PHP建立一個MySQL會話表。 enter link description here

+0

謝謝。我擔心遠程會話處理或用戶數據庫的一件事情是,我的應用程序調用了很多用戶數據庫,如果每次都遠程調用它,速度會變慢嗎?你介意看看我自己的答案,並給我一些想法嗎? – jackhao

+0

在你的回答中......如果你登錄到了child1,然後你訪問了child2,你還不會登錄到child2,因爲child2不知道你是誰。爲了識別你自己,你需要先登錄到child2,這是你不想要的。 – 2MAS

+0

我將登錄到child2,因爲child2會將我重定向到父項。com,我已經登錄了,並且我將被重定向回child2,並使用登錄加密的URL登錄我。 – jackhao

0

您可以編輯UserIdentity類,發現它在組件文件夾中,在每一個網站,並覆蓋authenticate()方法來檢查的OAuth,遠程數據庫,Web服務或你認爲它是舒適的你什麼都...方法不要擔心性能,因爲登錄每個會話只執行一次...

+0

感謝您的幫助。我很擔心,如果我本地沒有用戶表,每次查詢用戶數據庫時,我都需要遠程訪問。 – jackhao

0

爲什麼不創建類似這樣的東西?

MasterSite.com

用戶

  • ID
  • USER_EMAIL
  • 密碼

網站

  • 名稱

site_users

  • ID
  • USER_ID
  • SITE_ID

Child1.com

說出用戶的名字是Joe並訪問了www.child1.com。他點擊www.child1.com/register/。他將被重定向到www.mastersite.com/register/site/child1。註冊後他將被重定向回www.child1.com/session_id/abcdefgh12345

現在說用戶訪問www.child2.com。他訪問www.child2.com/login/。該系統將重定向他或從www.mastersite.com/login/彈出登錄。如果會話ID已經存在於www.mastersite.com上,那麼用戶將被簡單地重定向回www.child2。com/session_id/abcdefgh12345

該會話ID將存儲在MasterSite.com的數據庫中,偶爾會根據需要由www.childX.com進行更新。

在每個網站上存儲用戶的數據在一定程度上是可以的,但它可以真正快速地變醜。但是,由於現在有基於雲的解決方案......如果需要,我認爲在擴展MasterSite的數據庫或CPU功率時,這不是一個大問題。

+0

非常感謝您的幫助!我想我們在這裏有類似的解決方案.. – jackhao