2015-01-14 7 views
2

Laravel 4에서는 한 번에 한 사용자 당 한 세션 만 허용 할 수 있습니까?Laravel : 한 번에 한 사용자 당 하나의 세션 만 허용

예를 들어, 사용자가 로그인하여 이미 다른 세션이있는 경우 해당 다른 세션이 취소되며, 이유를 알려주는 방법이 바람직합니다.

아마 도움이된다면 Amazon ElastiCache에서 Redis 세션 드라이버를 사용하고 있습니다.

+0

한 번에 하나의 세션 만 활성화 할 수 있으며 여러 데이터를 넣으면 여러 개의 "세션"을 동시에 가질 수 있습니다. –

+1

무엇을 의미합니까? 기본적으로 Laravel 4에서는 사용자가 다른 컴퓨터에서 동일한 계정으로 여러 번 로그인 할 수 있으며 모든 세션이 유효합니다. 일단 로그인하면 UserId에 연결된 다른 모든 세션이 취소됩니다. –

+0

좋아, 지금은 이해하지만 이것을 해결하기 위해서는 주어진 사용자에게 연결된 모든 세션에 대해 세션 드라이버를 쿼리하고 삭제해야합니다. 일반적으로 나는 그것을 데이터베이스에 넣고 다른 것들은 지우지 만, 당신의 경우 나는 해결책을 알지 못한다. –

답변

9

그래, 나는 내 프로젝트와 비슷했다.

따라서 사용자 모델에 다른 속성 인 last_sessid를 추가해야합니다.

public function swapping($user) { 
    $new_sessid = \Session::getId(); //get new session_id after user sign in 
    $last_session = \Session::getHandler()->read($user->last_sessid); // retrive last session 

    if ($last_session) { 
     if (\Session::getHandler()->destroy($user->last_sessid)) { 
      // session was destroyed 
     } 
    } 

    $user->last_sessid = $new_sessid; 
    $user->save(); 
} 

이제 사용자가 활성 세션을 보유하고 있고 다른 브라우저에 로그인하면 첫 번째 세션이 제거됩니다.

P. 내 나쁜 영어 : 죄송는

+0

세션 재생성이 아닌가요? GMail과 같은 문제가 있다면 5 대의 컴퓨터에 로그인 할 수 있으며 다른 4 대의 사용자를 로그 아웃하려고합니까? 나는 당신의 코드가 자신의 문제를 해결하지 못한다고 생각합니다. –

+0

예 : firefox를 열고 로그인 한 것보다 크롬에 로그인 한 상태에서 크롬으로 돌아가서 로그인 한 사용자에 대해서만 권한이 필요하면 smth 필터가 예외를 throw하거나 오류와 함께 다시 리디렉션됩니다. etc ... 그리고 나를 위해,이 코드는 완벽하게 작동합니다 1 user - 1 session – xAoc

+0

하지만 사용자가 여러 곳에서 동시에 로그인 할 수 없도록 한 다음 다른 모든 사용자들과 로그 아웃하도록 선택할 수는 없습니다. –

0

같이 그것을 해결하기 위해 관리 (사용자 당) 레디 스에서 세션 id의

배열

예 : user.sessions.[userid] [ .... ] 로그인에

필터 전에 :

foreach (json_decode($redis->get('user.sessions.$userId')) as $sesId) { 
    Session::getHandler()->destroy($sesId)); 
} 

// add session to redis 
$redis->set('user.sessions.$userId', json_encode([Session::getId()])); 

이렇게하면 숫자 세션 한도를 만들 수 있으며 Redis에서 최대 NumActiveSessions - MaxSessions까지 삭제할 수 있습니다.

8

laravel 5.2의 경우 make:auth 명령을 실행 한 후 AuthController.php에 public function authenticated(Request $request,User $user) 메서드를 만들고 해당 메서드에서 로그인 후 원하는 것을 할 수 있습니다. 우리가 맨 위에있는 AuthController에 추가 사용자 당 하나의 세션에 대한 :

use Illuminate\Http\Request; 
use Auth; 

그리고 기능 추가 :

public function authenticated(Request $request,User $user){ 
    $previous_session = $user->session_id; 

    if ($previous_session) { 
     \Session::getHandler()->destroy($previous_session); 
    } 

    Auth::user()->session_id = \Session::getId(); 
    Auth::user()->save(); 
    return redirect()->intended($this->redirectPath()); 
} 

가 SESSION_ID 열이 사용자 테이블을 변경하기위한 마이그레이션을 추가해야합니다.

관련 문제