2016-05-24 20 views
7

Bir kullanıcı bir pertiküler cihazdan çıkış yaptığında, şimdiye kadar kaydettiği tüm cihazlardan çıkış yapmak istiyorum. Laravel'de nasıl yaparım.Laravel 5.2 - Bir kullanıcının tüm cihazlarından nasıl çıkış yapılacağı

ben "PREDIS/PREDIS" yükleyerek Oturum userId tutmak için REDIS kullandık: "~ 1.0"

Ve İşte signin ve Logout benim denetleyicisi geçerli:

public function postSignIn(Request $request) 
    {  

     if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ])) { 

     $redis = \Redis::connection(); 
     $userId=Session::getId(); 
     $redis->sadd('users:sessions:'.$userId,Session::getId()); 
      return redirect()->route('main'); 

     } 
     return redirect()->back(); 
    } 



public function getLogout() 
{ 
    $redis = Redis::connection(); 
    $userId=Session::getId(); 
    $userSessions = $redis->smembers('user:sessions:' . $userId); 
    $currentSession = Session::getId(); 
    foreach ($userSessions as $sessionId) { 
     if ($currentSession == $sessionId) { 
     continue; 

      } 
      $redis->srem('user:sessions:' . $userId, $sessionId); 
      $redis->del('laravel:' . $sessionId); 

     } 
    Auth::logout(); 
    return redirect()->route('main'); 
} 

başarıyla nereden çıkabilir giriş yapmış ve aynı zamanda çıkış yapmış, ancak diğer cihazlarda tüm oturumu öldürmez.

Sorunu nasıl çözebilirim?

+0

benziyor; ('Kullanıcı: oturumlarını' $ userId, $ sessionId.) $ redis-> del ('laravel:'. $ sessionId); –

+0

Redis Connection'ım ile aynı bir sorun var. Bu satırları değiştirdikten sonra hata alıyorum. – Hola

+0

hm '$ userId = Auth :: user() -> id; 'yerine kullanmanız gerektiğini düşünüyorum;' $ userId = Session :: getId(); 'ikincisi size oturum kimliği verir, ancak kullanıcı değil bununla birlikte, her defasında tek bir oturum numarası kaydedebilirsiniz – dyachenko

cevap

3

Yani mesele, Redis anahtar adına yazım hatası oldu yazma verisi için $redis->sadd('users:sessions:'.$userId,Session::getId()); kullanılan anahtarın öneki 'users:sessions:' ve verileri almak için $redis->srem('user:sessions:' . $userId, $sessionId); anahtarının öneki 'user:sessions:' Burada kod neden çalışmadı ve dd() boş dizi döndürdü. $ Yeniden dağıtılır> srem:

yüzden doğru kod Sadece getLogout fonksiyonu üzerine çizgi konumunu değiştirmeye çalıştığınızda bu

public function postSignIn(Request $request) 
{  

    if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ])) { 
     $redis = \Redis::connection(); 
     $userId=Session::getId(); 
     $redis->sadd('user:sessions:'.$userId,Session::getId()); 
     return redirect()->route('main'); 
    } 
    return redirect()->back(); 
} 



public function getLogout() 
{ 
    $redis = Redis::connection(); 
    $userId=Session::getId(); 
    $userSessions = $redis->smembers('user:sessions:' . $userId); 
    $currentSession = Session::getId(); 

    foreach ($userSessions as $sessionId) { 
     if ($currentSession == $sessionId) { 
      continue; 
     } 
      $redis->srem('user:sessions:' . $userId, $sessionId); 
      $redis->del('laravel:' . $sessionId); 
     } 
    Auth::logout(); 
    return redirect()->route('main'); 
} 
3

ben senin sorunu için öneri/geçici çözüm vardır: oturumları ile çalışma

veritabanında saklanmaz bir ** ağrı, yani Sorunu çözmek için farklı düşünmek zorunda. Kullanıcı oturumu açıldığında farklı bir çözüm kullanıcı kimliği ve saati kaydetmek olacaktır. Ardından, bağlantı son çıkış tarihinden daha eskiyse kullanıcının bağlantısını kesecek olan katman yazılımı oluşturun. Ve hepsi bu.


Benim prototip şöyle görünecektir:
yılında postSignIn yöntem çizgisi altında kullanıcıyı kaydedecektir (oturum) giriş tarihi: \Cache::put('last_logout_'.\Auth::id(), time());

: Aşağıdaki küresel kullanıcı çıkış tarihini kaydeder

getLogout yöntem doğrultusunda app('request')->session()->put('login_date', time());

Ve son dokunuş, buna benzer bir kodla birlikte middleware olur:

if ($user = \Auth::user()) { 
    $login_date  = app('request')->session()->get('login_date'); 
    $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); 
    if ($login_date < $last_logout_date) { 
     \Auth::logout(); 
     //redirect, error message... 
    } 
} 

Tam kodu:

Yöntem:

public function postSignIn(Request $request) 
{ 
    if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) { 
     app('request')->session()->put('login_date', time()); 

     return redirect()->route('main'); 
    } 

    return redirect()->back(); 
} 

public function getLogout() 
{ 
    \Cache::put('last_logout_' . \Auth::id(), time()); 
    Auth::logout(); 

    return redirect()->route('main'); 
} 

Ara Katman:

<?php 

namespace App\Http\Middleware; 

use Closure; 

class LogoutIfExpired 
{ 
    public function handle($request, Closure $next, $guard = null) 
    { 
     if ($user = \Auth::user()) { 
      $login_date  = app('request')->session()->get('login_date'); 
      $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); 
      if ($login_date < $last_logout_date) { 
       \Auth::logout(); 

       return redirect()->route('main'); 
      } 
     } 

     return $next($request); 
    } 
} 
+0

tam kod ile bana yardımcı olabilir misiniz? Mümkünse ..Ben gerçekten söylemek istediğin şeyi alamıyorum! – Hola

+0

@ x69 Sorun değil, cevabımı ekledim. –

+0

Ayrıca, QUEUE_DRIVER öğenizin "senkronizasyon" olmadığından emin olun. –