2014-10-14 2 views
2

그런 식으로 로그인을 한 번만 제한하면 한 번에 한 계정을 여러 번 사용하여 로그인 할 수 없습니다. 또한 사용자가 다른 서버에 로그온 할 수 있으므로 session_destroy를 사용할 수 없으므로 "수동으로"세션을 삭제해야합니다.원격 서버에서 memcache 세션 삭제하기

파일 저장과 세션을 사용할 때 파일이 삭제되고 로그인이 삭제되며 새로운 사용자는 모두 잘 작동합니다. 그러나 memcache와 함께 세션을 사용할 때 memcache에서 세션을 삭제할 수 있지만 동일한 요청의 추가 로그인은 손실됩니다. 잘못 될 것인가

session_regenerate_id(); 
$session_id = session_id(); 

$m = new Memcache(); 
$m->connect('XXX.XXX.XXX.XXX', 11211); 

$ans = $m->delete(SESSION_ID_OF_ALREADY_LOGGED_USER); 

$query = "UPDATE activeLogins SET activeSession = '{$session_id}' WHERE userEmail = $safeEmail LIMIT 1"; 
$dbh->exec($query); 

//Login new user... 

어떤 생각을 :

이 내가 그것을 어떻게?

+0

로그인 및 세션/memcache 저장 프로세스가 약간 불명확합니다. 더 많은 코드 스 니펫/설명? – ToBe

+0

@ToBe 로그인은 세션 변수를 true로 저장하는 것으로 간단합니다. Memcache 세션 저장은'session.save_handler'와'session.save_path'를 변경함으로써 php.ini에서 변경되었습니다. 또한 **이 페이지가 완료되면 memcached 세션에서 지금 데이터를 푸시합니다. 마지막 단계는 memcached 내의 데이터 만료를 제어하기 때문에 중요합니다. ** [http://blog.preinheimer.com/index.php?/archives/334-Storing-Sessions- in-Memcache-how-everything-behaves.html) – Dexa

+0

memcache를 사용하는 세션이 실제로 작동하는지 확인 했습니까? 확실하지 않은 경우 매우 작은 PHP 파일을 만들어 코드의 오류를 제외하고 하나의 세션 변수로 시도하십시오. – ToBe

답변

2

확인 당신이 하나의 클라이언트 컴퓨터에 하나의 사용자를 제한 할 알고있는 것처럼 데이터베이스

에 저장되어 있는지에 대한 세션 ID. 그리고 그 기계는 로그인 한 마지막 기계 여야합니다. 난 당신이 각 페이지로드에 대한 간단한 확인과 함께 이것을 달성 할 수 있어야한다고 생각합니다.

질문에서 데이터베이스에 activeLogins이라는 테이블이 있습니다 (이 필드는 activeSessionuserEmail입니다).

여기에서 사용자를 고유하게 식별하는 이메일 주소라고 가정합니다. 따라서 새로운 로그인 이후에 $session_id, $safeEmailactiveLogins 테이블에 해당 업데이트 된 행이 있습니다.

사용자가 이전 컴퓨터에서 로그 아웃하지 않았다고 가정 해 봅시다. 다음 페이지로드시에 무엇이 발생합니까 (activeLogins 테이블을 업데이트하기 전에)? 맞습니다. activeSession은 해당 서버의 $session_id과 다릅니다. 새 로그인이 그것을 변경했음을 기억하십시오.

$session_idactiveLogins 테이블의 activeSession과 일치하는지 확인하면됩니다.

또한 각 페이지로드가 아닌 새로운 로그인 후에 activeLogins 테이블 만 업데이트하는 것이 좋습니다. 귀하의 질문에서 당신이 이것을할지 여부는 분명하지 않지만.

이 질문이 실제로 귀하의 질문에 대답하는지 확실하지 않습니다. 그것은 아주 간단한 대답처럼 보입니다. 그러나 당신은 질문이 명확하지 않습니다. 각 페이지로드시에이 순서대로 표시하는 코드를 실제로 사용하고 있습니까?!

모든 답변에 대해 서버에서 클라이언트 컴퓨터로 알림을 푸시하는 가장 좋은 방법을 모색했습니다. 자네가 언급 한 한 가지 방법은 아약스 폴링이지만, 나는 이것이 나쁜 습관이라고 생각하며 사용해서는 안된다.

래칫 (http://socketo.me)이 계속 연결됩니다. 다른 로그인이 감지되고 이전 클라이언트의 로그인에 반응 할 때 연결을 제거하기 만하면됩니다.

https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events

을하지만 일반적으로 사용할 수 없습니다 그래서, IE에서 지원되지 않는 :

또한 서버에서 클라이언트로 이벤트를 송신하기위한 높은 수준의 인터페이스가있다.

또한 http://pusher.com

모든 제안의 요점은 당신이 효율적으로 당신이 제공하고있는 사이트에 대한 액세스를 제거해야합니다 것을 나타내는, 클라이언트에 신호를 밀어 수 있다는 것입니다

에 모습을 가질 수

없이 끊임없이 폴링.

+0

답장을 보내 주셔서 감사합니다. 실제로 페이지를로드 할 때뿐만 아니라 사용자를 즉시 ​​로그 아웃해야합니다 (+/- 몇 초). 아약스 요청에서 말한 내용을 사용할 수도 있습니다. 코드베이스가 훨씬 더 커졌습니다 제공 한 예제보다 복잡하지만 그 범위를 좁히고 싶었습니다. 각 페이지로드에 정확한 코드를 사용하지 않고 로그인 할 때 사용합니다. 간단한 대답이지만 그 방향으로 생각하지 않았습니다. 감사하겠습니다. – Dexa

+0

아, 알겠습니다.클라이언트 컴퓨터에서 브라우저를 제어하는 ​​확실한 방법은 없습니다. 그러나 사용자가 Javascript를 사용한다고 가정하면 session_id가 변경되지 않았는지 확인하기 위해 일반 Ajax 호출 (1 분마다 한 번?)을 사용할 수 있습니다. 그럴 경우로드 된 마지막 페이지를 제거하고 '다른 클라이언트에 로그인'메시지를 표시 할 수 있습니다. 또한 브라우저의 기록/캐시에서 제거되었는지 확인하십시오. 물론 인터넷 연결이 살아 있어야합니다. –

+0

또 다른 방법은 Javascript를 사용하여 사용자가 어떤 작업을하는지 확인하는 것입니다. 그들이 얼마 동안 아무 것도하지 않으면 적재 된 페이지를 제거 할 수 있습니다. 이 방법은 인터넷 연결이 아닌 Javascript에만 의존합니다. 이것은 사용자에게 좋지 않습니다. 중요한 페이지 내용으로 만 제한 할 수 있습니다. –

관련 문제