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