0

にログインしているかどうかを確認するためのチェックを実装します郵便配達員を使用してテストされて私は適切にユーザーのセッションがすでにアクティブでログインしているかどうかを確認するためにチェックを実装する方法のように少しこだわっている以下の通りのシナリオである:ローカルストレージの削除Laravel 5.2または5.3:私はイオンのフロントエンドとし、サーバー側と対話Laravel 5.2.45を使用して、アプリケーション、に取り組んでいますどのように適切にセッションがすでに

が言うにユーザー登録するとシステムはログインしています。イオンブラウザーと郵便配達所でテストすると、適切な情報がすべて返されます。さらに、セッションのファイルではなく、データベース内でもセッションが生成されます(セッションにファイルを使用する必要はありません)。 ユーザーがブラウザを検査し、ローカルストレージデータを削除し、キャッシュされたすべての情報とCookieを削除するとします。すべてのクライアント側のストアド・データを削除した後、ユーザーは同じ信任状でログインしようとします。ここで問題が発生します。

問題:ユーザーが/ログインルートに当たると
が、これは自動的にすでにDB内の別のアクティブなセッションがあるかどうかを確認するためにチェックを最初にせずに、データベース内の別の新しいセッションを生成します。これは/ loginルートにpingを実行するたびに発生します。だから、基本的に誰かがログインしてローカルストレージを削除して再度ログインすると(そして1000回以上実行すると)、セッションテーブルにある不完全なセッションがデータベースに溢れてしまいます。

セッションテーブルに複数のセッションを持つ唯一の時間は、2つの別々のデバイスからログオンするときです。しかしその場合、その時点で1つのセッションだけがアクティブになっている必要がありますが、そのユーザーに対してデータベースに2つのセッションが記録されます。

質問: どうか 私はライブ/アクティブなセッションがデータベース と 認証/資格証明書を添付以内にすでに存在していることをミドルウェアを通じて確認するためにシステムのクリーン、適切な方法を実装しますユーザーは、DB内のアクティブなセッションに基づいて、そのアクティブなセッションにログインしようとしていますか?

この質問はクリーンLaravel(5.2.45)以上のインストールをした後に基づいています。サーバー側に追加のコードが追加されず、ブレードテンプレートが使用されていない場合。リダイレクトはイオンプラットフォームを介して行われており、郵便配達所でテストするときはデータの返品のみが必要です。それを実装し、さらにそれを取る方には十分な説明的に正確ではなく、以下の

リンクを、私はそれが認証::チェックをした後に発生する必要がある他のプロセスを持っているので:私が行ってきた

() how to check if user is logged in by his session in route and then call controller method in laravel?

これについてのご支援をいただければ幸いです。 ありがとう!

答えて

2

私は次のようにします私は定義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):

<?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で:

1)routes.phpにIがルートグループにミドルウェアを定義します(カスタム lib)

(モデルのフォルダを作成することを忘れないでください)

<?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中:app/Models/User.php

4)

<?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