2014-02-11 2 views
0

나는 SSO (Single Sign On)와 관련하여 이와 비슷한 질문을했지만, 하위 도메인에서만 작동하지만 하위 서버는 사용하지 않고 같은 서버에서 다른 Yii 응용 프로그램을 사용하고 있음을 깨달았습니다. 한 도메인 아래동일한 서버에있는 두 개의 Yii 앱에서 사용자를 인증하는 방법은 무엇입니까?

나는 www.mydomain.com/app1과 www.mydomain.com/app2이

이 두 응용 프로그램은 동일한 데이터베이스를 사용하여 로깅에 대해 동일한 테이블을 사용합니다.

나는 일이 원하는 것은는 :

계정은 두 응용 프로그램

  1. 사용자에 대해 동일합니다 app2 (또는 app1. 문제가되지 않습니다.)
  2. 사용자가 로그인되어 있으며 홈페이지로 연결됩니다.
  3. 사용자가 app2 (또는 app2에서 온 경우 app1)로 리디렉션되는 메뉴에서 링크를 클릭합니다.
  4. 사용자는 이미 로그인되어 있고 계정의 홈 페이지로 리디렉션되므로 app2로 리디렉션되고 로그인을 건너 뜁니다.
  5. 사용자가 메뉴에서 로그 아웃 링크를 클릭합니다.
  6. 사용자가 두 응용 프로그램에서 모두 로그 아웃됩니다.

발생하지 무엇

(4). 사용자는 APP1로 리디렉션됩니다하지만 여전히 로그인하라는 메시지가 나타납니다 그때 APP1 & APP2에서 쿠키 및 세션을보고 확인

와 내가는 config 폴더에 모두 main.php에 대해 다음 않았다.

// 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>', 
     ), 
    ), 

나는 1 주일 동안이 일에 매달 렸고 마감일이 곧 다가오고 있기 때문에 필요한 도움을 얻을 시간이 다가왔다.

편집 이것은 CDbHttpSession을 사용하여 세션을 시작하는 구성 파일 main.php입니다.

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

지금 작품에서 로그인 및 세션이 데이터베이스에 저장되는하지만 여전히 두 응용 프로그램에 로그인 아니에요 : 지금 YiiSession라는 데이터베이스 테이블에 세션을 저장하고있다. 두 응용 프로그램 모두이 동일한 구성을 갖습니다.

답변

2

내 첫 번째 발언은 쿠키가 좋은 도메인을 가지고 있는지 확인하여 두 앱이 모두 수신하고 동일한 세션을 사용하는 것입니다. 당신은 이미 그것을 확인한 것으로 보이며 괜찮습니다.

이제 어떤 사용자가 현재 로그인되어 있는지 확인하기 위해 CWebUser는 세션에서 [some prefix] __ id 변수를 찾습니다. 해당 접두어는 CWebUser->stateKeyPrefix이거나 비어있는 경우 클래스 이름과 Yii 응용 프로그램 ID를 기반으로 한 MD5 일 수 있습니다.

차례로 Yii 응용 프로그램 ID는 CApplication->id 속성에 의해 지정되거나 응용 프로그램의 기본 경로를 기반으로 생성됩니다.

가장 간단한 방법은 두 응용 프로그램에 동일한 응용 프로그램 ID를 추가하는 것이므로 두 응용 프로그램 모두 동일한 쿠키를 사용할 수 있어야하며 "로그인 한 사용자를 감지합니다".

그냥 구성을 편집하고 모두 응용 프로그램에 대한 가장 높은 수준에서 "ID"를 추가 :이 CWebUser::getStateKeyPrefix()이 같은 접두사와 프레스토를 생성 할 것 같은 ID를 반환 Yii::app()->id가 발생합니다

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

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

, 두 응용 프로그램 모두 세션에서 __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

구성이 응용 프로그램 개체에 설정되었습니다. 그래서 당신이 Yii :: app() -> setId()에 전달 될 최고 수준의 "id"를주는 경우 등등. 잘못된 정보를 찾고 더 많은 정보를 제공 할 수 있는지 알 수 있습니까? – Blizz

관련 문제