2014-02-11 27 views
0

我已經問過關於單點登錄(SSO)過去的類似問題,但我意識到這隻適用於子域名,但在我的情況下,我沒有使用子域名,而是在同一臺服務器上使用不同的Yii應用程序在一個域名下。如何從同一臺服務器上的兩個Yii應用驗證用戶?

我有www.mydomain.com/app1和www.mydomain.com/app2

兩個應用程序都使用同一個數據庫,並使用相同的表格進行記錄。

我想會發生什麼

帳戶是兩個應用程序

  1. 用戶相同登錄到app2(或app1。沒關係)
  2. 用戶已登錄並被導向主頁。
  3. 用戶單擊重定向他們APP2菜單中的鏈接(或APP1如果他們從APP 2來)
  4. 用戶被重定向到APP 2和,因爲他們已經簽署,並重定向到該帳戶的主頁跳過登錄。
  5. 用戶從菜單中單擊註銷鏈接。
  6. 用戶從兩個應用程序中註銷。

什麼是不會發生

(4)。用戶被重定向到APP1,但仍提示您登錄

我接下來,檢查餅乾和會議APP1 & APP 2和兩個main.php在config文件夾中,我做了以下內容:

// application components 
'components'=>array(
    'user'=>array(
     // enable cookie-based authentication 
     'allowAutoLogin'=>true, 
     'class'=>'WebUser', 
    ), 
    'session'=> array(
     'timeout'=> 1440 
    ), 
    'partyroles'=>array(
     // enable cookie-based authentication 
     'class'=>'WebUser', 
    ), 
    // uncomment the following to enable URLs in path-format 

    'urlManager'=>array(
     'urlFormat'=>'path', 
     'rules'=>array(
      '<controller:\w+>/<id:\d+>'=>'<controller>/view', 
      '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', 
      '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', 
     ), 
    ), 

我一直堅持這一整個星期,由於截止日期即將到來,我認爲是時候得到一些必要的幫助!

編輯 這是我的配置文件main.php啓動會話使用CDbHttpSession。現在我保存會話到名爲YiiSession數據庫表:

'sessionName'=>'app', 
     'class'=>'CDbHttpSession', 
     'autoCreateSessionTable'=> false, 
     'connectionID'=>'db', 
     'sessionTableName'=>'YiiSession', 
     'useTransParentSessionID' =>($_POST['PHPSESSID']) ? true: false, 
     'autoStart' => 'false', 
     'cookieMode' => 'only', 
     'timeout'=> 300 
    ), 

記錄在現在的工作和會議被存儲到數據庫中,但它仍然無法登錄到兩個應用程序。兩個應用程序都具有相同的配置

回答

2

我的第一個評論是檢查cookie是否具有良好的域,因此這兩個應用程序收到它們並使用相同的會話。看來你已經檢查過了,那沒關係。

現在,要確定哪個用戶當前登錄,CWebUser在會話中查找[some prefix] __ id變量。該前綴可以是CWebUser->stateKeyPrefix,如果爲空,也可以是基於類名稱和Yii應用程序標識的MD5。反過來

的Yii應用ID或者由CApplication->id屬性指定,或基於應用程序的基本路徑上產生的。

所以最簡單的方法是將同一應用程序ID添加到這兩個應用程序,它應該然後能夠使用相同的cookie VOOR兩個應用程序,並且將「檢測登錄的用戶」。

只要編輯您的配置,並在最高級別添加一個「id」爲您的應用程序:

return array 
(
    'id' => 'sharedApplicationId', 

    'components' => array(...), 
); 

這將導致Yii::app()->id返回相同的ID,這將使CWebUser::getStateKeyPrefix()產生相同的前綴和急,這兩個應用程序將在會話中找到__id變量。

或者,你可以通過配置來配置國家重點前綴CWebUser

return array 
(
    ... 
    'components' => array 
    (
     'user' => array 
     (
      'stateKeyPrefix' => 'some_shared_prefix', 
      ... 
     ), 
    ), 
); 

這隻會影響CWebUser類即可。然後它會查找像「some_shared_prefix__id」這樣的會話變量來確定登錄用戶,而不是使用應用程序ID。無論哪種方式應該工作。

因此,基本上,即使您共享數據庫(和會話),如果前綴CWebUser結束使用,因爲一個「壞」的配置是不同的,你只需要在會議application1StateKeyPrefix__idapplication2StateKeyPrefix__id,他們贏了看不到對方的登錄用戶。

+0

我總是讀到它放置在最高水平。有什麼理由爲什麼?我很好奇配置。看起來好像有一個層次結構來配置你的配置,但我想知道爲什麼! :) 此外, 'ID' 可以是任何東西,對不對? –

+0

我還補充說,你送我的代碼行添加到我的配置上,它甚至不運行我的應用程序。 –

+0

那麼配置是在應用程序對象上設置的。所以如果你給它一個最高級別的「id」,它將被傳遞給Yii :: app() - > setId()等等。你能否看到你是否能找到問題並提供更多信息? – Blizz

相關問題