2013-05-09 6 views
1

저는 Appfog에서 Yii-app를 실행하고 있습니다. 두 개 이상의 인스턴스를 가질 때마다 더 이상 로그인 상태를 유지할 수 없습니다.여러 인스턴스가 임의로 사용자를 로그 아웃합니다.

여러 인스턴스에 세션에 대한 공유 저장소가 필요하며 EDMSHttpSession을 사용하여이를 구현했습니다. 그리고 그것은 localhost에서 작동합니다. 즉, 로그인 할 수 있고, Apache를 다시 시작하고 로그인 상태를 유지합니다. 또한 데이터베이스에서 세션 레코드를 제거하면 로그 아웃됩니다. 이것은 PHP가 세션을 저장하기 위해 데이터베이스를 사용하고 있다고 결론 내립니다.

세션의 공유 저장소가 Appfog에서 작동하지 않는 이유를 이해할 수 없으며 이 오류를 디버깅하는 방법에 대한 제안이 필요합니다.

좀 더 배경 정보 :

  • 나는 자동 로그인을 위해 쿠키를 사용합니다. 그들은 30 일 동안 유효해야합니다 (그리고 크롬 관리자에 따라 )하지만 그것은 더 이상 작동하지 않습니다 다음 몇 시간 (브라우저 세션에서 추측) - 에 대한 로컬 호스트가 아닌 것 같아요.
  • 여러 인스턴스와 자동 로그인을 사용하면 (즉, "remember me"을 클릭) 나는 보통 2 ~ 3 시간 후에 임의로 쫓겨납니다. 페이지가 새로 고침됩니다. 쿠키가 서버 세션에 관계없이 에 자동으로 로그인해야한다는 것을 알고 있습니까?
  • Appfog에서 로컬 호스트에 SSL 끝점이 있습니다. 그렇지 않습니다.
  • 나는 Appfog 내 공유 세션 스토리지 (데이터베이스 테이블을보고) 새로운 세션을 받고 있음을 확인했다

업데이트 :

것은 내가 몇 가지 테스트 아마도 내 결과가 sence을 만들 것 않았다 어떤 것.

쿠키를 모두 지우고 내 Appfog 앱을 다시 시작하십시오. 로그인하여 "내 계정 정보 기억"을 확인하십시오. 이제 다음과 같은 응답을 설정 - 쿠키 헤더는 다음과 같습니다 후속 요청에

Set-Cookie:PHPSESSID=vrfoi0o15v3qps2644uqtvkfa1; path=/ 
Set-Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; path=/ 
Set-Cookie:73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D; expires=Sun, 09-Jun-2013 08:32:24 GMT; path=/ 

쿠키 헤더는 요청 :

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D 

내가 데이터베이스 내 세션을 찾을 "db38s1k1vp5ngll837ac0vh0u7"를 사용합니다. 해당 행은 다음과 같습니다 (vrfoi0o15v3qps2644uqtvkfa1가 데이터베이스에서 발견하지 않는다) :

{ 
    "_id" : ObjectId("518cb0981045979e06000000"), 
    "data" : "73dfaf673b71b1f92d34b8ab63dab17b__id|s:24:\"5087ea0b3145a75545000000\";73dfaf673b71b1f92d34b8ab63dab17b__name|s:22:\"[email protected]\";73dfaf673b71b1f92d34b8ab63dab17b__states|a:0:{}73dfaf673b71b1f92d34b8ab63dab17brole|s:4:\"demo\";", 
    "expire" : 1368176186, 
    "id" : "db38s1k1vp5ngll837ac0vh0u7" 
} 

지금 난 다시 내 Appfog 응용 프로그램을 다시 시작하고 내 app.Now 내가 로그 아웃 얻을에서 다른 페이지로 이동하려고합니다.그래서 당신이 이동

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D 

답변

0

마지막으로 나는 Michael Härtl 제안 덕분에이 문제를 성공적으로 디버깅했습니다.

나는 두 가지

1

) 보호/설정/main.php
array(
    'name' => 'My App', 
    'id' => 'yourdomain', 
    ..., 
) 

이로하지 않으면

, 여러 인스턴스가있을 것이다 다른 IDS에서 응용 프로그램 ID를 지정 문제를 해결했다 . Yii는 app-id 해시를 사용하여 세션 변수의 접두사를 사용하기 때문에 공유 세션 저장 공간이 있더라도 다른 인스턴스간에 공유됩니다. 이 Yii 기사에서는 더 자세히 설명합니다. http://www.yiiframework.com/wiki/135/single-sign-on-across-multiple-subdomains/

2) 공유하는 chaching과 함께 자산에는 CDN을 사용하십시오. 자산 폴더 (예 : 3f4ad45)는이 인스턴스간에 다를 수 있으므로 공유 저장 장치를 사용해야합니다. 애셋 관리에는 확장 http://www.yiiframework.com/extension/s3assetmanager/을 사용하고 캐시에는 https://github.com/aarondfrancis/yii-CMemCacheSASL (MemCachier)을 사용했습니다.

1

에만 디버깅하는 방법에 대한 제안 요청 : 페이지를 로그인하는 재 이전

요청 쿠키 헤더는 (이전과 동일)이었다

  • 각 인스턴스 레이아웃 파일에 다른 숨겨진 문자열을 추가하여 현재 요청을 처리 한 인스턴스를 확인할 수 있습니다.
  • 브라우저에서 요청/응답 헤더의 쿠키를 검사하여 동일한 세션 ID가 e 매우 요청하고 새로운 서버가 귀하의 서버에서 다시 반송되는 경우

이렇게하면 세션이 손실 된 조건을 파악하는 데 도움이 될 수 있습니다.

YII 그냥 로그 아웃 경우

  • 세션이 정말 파괴 있는지 알아보십시오 또는 UPDATE. 이렇게하려면 게스트 사용자로 세션에 내용을 쓰고 일부 정보를 다시로드 할 때이 정보가 손실되면 다시 시도하십시오.
  • allowAutoLogin을 비활성화하고 지금 작동하는지 확인하십시오.
+0

감사! 나는 데이터베이스에서 쿠키와 세션에 어떤 변화가 있는지 확인하고 질문을 업데이트했다. 쿠키 헤더에 이상한 점이 있습니까? – luttkens

+0

흠. 업데이트를 참조하십시오. 세션이 손실되지 않은 것 같습니다. DB에서 확인할 수 있습니다. –

+1

지금 당장! 우선 게스트 사용자는 모든 페이지로드시 세션 ID가 변경되었음을 알았습니다. 나는 헤더를보고 모든 페이지에'Pragma : no-cache'와'Cache-Control : no-cache, no-store, must-revalidate'가 있음을 알았습니다. 'no-store'를 제거 할 때 세션 ID는 동일하게 유지되었고 이제는 다중 인스턴스가 작동합니다 (거의 각 인스턴스마다 다르며 YIn의 자산 폴더에 문제가 있습니다. 그러나 CDN이이를 해결해야합니다). – luttkens