0

我正在使用Laravel 5.2.45處理應用程序,該應用程序與離子前端和服務器端交互正在使用郵差測試。我有點卡住關於如何正確地實施檢查,以查看該用戶的會話已經被激活並登錄下面是一個概括的場景:Laravel 5.2或5.3:如何正確執行檢查以查看會話是否已登錄

刪除本地存儲: 說與用戶註冊系統並登錄。在離子瀏覽器和郵遞員測試時,所有適當的信息都會返回。另外,會話也會在數據庫中生成,而不是文件(如預期的那樣,否,我們不希望將這些文件用於會話)。 現在說用戶檢查瀏覽器並刪除其本地存儲數據並刪除所有緩存的信息和cookie。刪除所有客戶端存儲的數據後,用戶嘗試使用相同的憑據登錄。這是問題發生的地方。

問題:
當用戶點擊/登錄路由,這將自動生成數據庫中的另一個新的會話,而無需首先檢查,看是否已經有數據庫中的另一個活動會話。每次我ping通/登錄路由時都會發生這種情況。所以基本上,如果有人要登錄,然後再刪除他們的本地存儲並再次登錄(並且執行1000次以上),他們最終可能會在會話表中發生錯誤的會話,並將所有連接到用戶帳戶的數據庫洪水氾濫。

某人在會話表中唯一有多個會話的時間是從兩個單獨的設備登錄時。但是,在這種情況下,當時只有1個會話處於活動狀態,但在數據庫中仍會爲該用戶記錄2個會話。

問: 如何或在哪裏 我將實現清潔,正確的方法爲系統通過中間件檢查已經存在的數據庫中的實時/活動會話 和 認證/附上證書的用戶正嘗試使用基於DB中的活動會話重新登錄到該活動會話?

這個問題是基於Laravel(5.2.45)或更高版本的乾淨安裝後。沒有附加代碼添加到服務器端,並且NO刀片模板正在使用。通過離子平臺進行重定向,並且只有在郵遞員測試時纔會有數據返回。

凡我已經走了:

下面的鏈接準確的,但沒有足夠的描述中如何實現它,並把它進一步的,因爲我有一個需要它的驗證::檢查後,會出現其他進程() how to check if user is logged in by his session in route and then call controller method in laravel?

對此的任何幫助將不勝感激。 謝謝!

回答

2

我以下:

1)在routes.php我定義中間件路由組:在app/Http/Middleware/HasAccessToBilling.php

Route::group(['prefix' => 'auth'], function() { 
    Route::get('/', ['as' => 'auth', 'uses' => '[email protected]']); 
    Route::post('/', ['as' => 'auth.attempt', 'uses' => '[email protected]']); 
    Route::delete('/', ['uses' => '[email protected]']); 
    Route::any('destroy', ['as' => 'auth.destroy', 'uses' => '[email protected]']); 
}); 

Route::group(['prefix' => 'billing', 'namespace' => 'Billing', 'middleware' => ['App\Http\Middleware\HasAccessToBilling']], function() 
{ 
    Route::any('/', ['as' => 'billing', 'uses' => '[email protected]']); 
    Route::get('profile', ['as' => 'billing.profile', 'uses' => '[email protected]']); 
}); 

2)I限定:

<?php namespace App\Http\Middleware; 

use App\Library\Auth; 
use Closure; 
use Illuminate\Http\Request; 

class HasAccessToBilling 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle(Request $request, Closure $next) 
    { 
     if (Auth::hasAccessTo('billing', $request)) { 
      return $next($request); 
     } 
     return redirect()->route('auth'); 
    } 
} 

3)在app/Library/Auth.php:(定製Auth lib)

<?php namespace App\Library; 

use \App\Models\User; // I keep Models in app/Models folder and define namespace App\Models; 
use Illuminate\Http\Request; 
use Crypt; 

class Auth 
{ 
    const REALMS = 'api,billing'; 

    public static function attempt($realm, Request $request) 
    { 
     $username = $request->input('username'); 
     $password = $request->input('password'); 
     $remember = $request->input('remember', false); 

     $User = (filter_var($username, FILTER_VALIDATE_EMAIL)) ? 
      User::whereEmail($username)->first() 
      : User::whereUsername($username)->first(); 
     if (!$User) { 
      return false; 
     } 

     if (!$User->checkPassword($password)) { 
      return false; 
     } 

     $realms = (is_array($realm) AND !empty($realm)) ? $realm : [$realm]; 
     $auth = [ 
      'timestamp' => time(), 
      'user_id' => $User->id, 
      'access_to' => [], 
      'roles' => [], 
      'permissions' => [] 
     ]; 
     $auth = $request->session()->get('auth', $auth); 
     foreach ($realms AS $realm) { 
      if (!in_array($realm, $auth['access_to'])) { 
       $auth['access_to'][] = $realm; 
      } 
     } 

     if($remember) { 
      $rememberToken = Crypt::encrypt(json_encode($auth)); 
      $auth['remember-token'] = $rememberToken; 
     } 
     $request->session()->put('auth', $auth); 

     return $auth; 
    } 

    public static function destroy(Request $request, $realm = null) 
    { 
     if (is_null($realm)) { 
      $request->session()->forget('auth'); 
      return true; 
     } 

     $auth = $request->session()->get('auth'); 
     if (isset($auth['access_to'])) { 
      $realms = (is_array($realm) AND !empty($realm)) ? $realm : [$realm]; 
      foreach ($realms AS $realm) { 
       $key = array_search($realm, $auth['access_to']); 
       unset($auth['access_to'][$key]); 
      } 
      $auth['access_to'] = array_values($auth['access_to']); 
      if(sizeof($auth['access_to']) > 0) { 
       $request->session()->put('auth', $auth); 
      } 
      else { 
       $request->session()->forget('auth'); 
      } 
      return true; 
     } 
     return false; 
    } 

    public static function recoverSession(Request $request) 
    { 
     $rememberToken = $request->cookie('remember-token', null); 
     if(is_null($rememberToken)) { 
      return null; 
     } 

     try{ 
      $rememberToken = Crypt::decrypt($rememberToken); 
      $auth = json_decode($rememberToken, true); 
      $request->session()->set('auth', $auth); 
     } 
     catch(\Exception $ex) {} 

     return $request->session()->get('auth'); 
    } 

    public static function hasAccessTo($realm, Request $request) 
    { 
     $auth = $request->session()->get('auth', null); 
     if (is_null($auth)) { 
      $auth = self::recoverSession($request); 
     } 

     return (isset($auth['access_to']))? 
       in_array($realm, $auth['access_to']) 
       : false; 
    } 
} 

4)app/Models/User.php:(不要忘記創建模型文件夾)

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Hash; 
use Closure; 

class User extends Model 
{ 
    const USERNAME_MAXLEN = 2; 
    const PASSWORD_MAXLEN = 5; 
    protected $table = 'users'; 
    protected $fillable = ['username', 'email', 'password', 'active', 'deleted']; 

    public function checkPassword($password) 
    { 
     return Hash::check($password, $this->password); 
    } 

    public function updateAndCall($attributes = [], Closure $closure) { 
     if(isset($attributes['password'])) { 
      $attributes['password'] = Hash::make($attributes['password']); 
     } 
     $this->update($attributes); 
     return $closure($this); 
    } 

    public static function createAndCall($attributes = [], Closure $closure) { 
     if(isset($attributes['password'])) { 
      $attributes['password'] = Hash::make($attributes['password']); 
     } 
     $Record = self::create($attributes); 
     return $closure($Record); 
    } 
} 

5)app\Http\Controllers\AuthController.php

<?php namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Library\Auth; 

class AuthController extends Controller 
{ 
    public function index() 
    { 

     return view('auth.index'); 
    } 

    public function attempt(Request $request) 
    { 
     $realms = $request->get('realm', Auth::REALMS); 
     if (!is_null($realms)) { 
      $realms = explode(',', $realms); 
     } 

     $auth = Auth::attempt($realms, $request); 
     if ($auth === false) { 
      return $this->forbidden('Username and/or Password invalid!'); 
     } 

     foreach ($realms AS $realm) { 
      if (!Auth::hasAccessTo($realm, $request)) { 
       return $this->forbidden('Access denied'); 
      } 
     } 

     if (isset($auth['remember-token'])) { 
      $this->setCookie('remember-token', $auth['remember-token'], 525600); // 1 year 
     } 

     return $this->ok(null, ['redirectTo' => $realms[0]]); 
    } 

    public function destroy(Request $request) 
    { 
     $realms = $request->get('realm', Auth::REALMS); 
     if (is_array($realms) AND !empty($realms)) { 
      $realms = explode(',', $realms); 
     } 
     Auth::destroy($request, $realms); 
     $this->deleteCookie('remember-token'); 

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



免費填寫您希望如何使用它( ;

+1

感謝您的快速響應。我會調查你的概念,並申請,如果一切檢查。如果我最終這樣做,我會標記爲已回答!再次感謝您的幫助。 –

+1

您提供的示例中顯示的概念幫助我在分解問題的根本原因以及如何正確實施會話處理方面做了大量工作。當我穩定了一切,希望幫助其他可能遇到我發現的相同問題的人時,我會在適當的時候公佈我得到的結果。 再次感謝男人! –

+0

@ user3124770我真的希望這是您的最佳解決方案。 – num8er