ホームページ  >  記事  >  バックエンド開発  >  Laravel5の高速認証ロジックフローの分析

Laravel5の高速認証ロジックフローの分析

不言
不言オリジナル
2018-07-04 15:42:501811ブラウズ

この記事では、主に Laravel5 の高速認証ロジック処理の分析を紹介します。一定の参考値があります。今、共有します。困っている友達は参考にしてください。

Laravel5 自体には、ユーザー認証機能を使用するには、コマンド ライン php 職人 make:auth を使用し、新しいプロジェクトの下で php 職人が移行するだけで、組み込みの高速認証機能を使用できます。

以下は、Laravel 5.5 バージョンに基づいたログイン関数の論理分析です。

コマンド php 職人ルート:リストを使用してログイン ルート (赤いボックス) を取得します:

/app/Http/Controller/Auth/ を開いて表示します。 LoginController.php 、ファイル コードは非常に簡潔です。実際、ログイン ロジックとメソッドは Illuminate/Foundation/Auth/AuthenticatesUsers の特性に統合されています。 \Foundation\Auth\AuthenticatesUsers コード ログイン メソッド、パラメータ $request はリクエスト オブジェクトであり、ログイン名、パスワードなどのログイン リクエスト情報が含まれます:

line31:

validateLogin メソッドは、コントローラー自体の validate メソッドを呼び出す役割を果たし、ユーザー名とパスワードが単純なルールに準拠しているかどうかを検証します。これについて詳しく説明する必要はありません。

赤いボックスでマークされたユーザー名メソッドに注目してください。開発者は、LoginController でこのメソッドをカスタマイズして、特性メソッドをオーバーライドし、ログイン アカウント フィールドをカスタマイズできます。特性のデフォルトは、メールする'。

Laravel5 フレームワークの整合性を維持するため、トレイトの username() メソッドを直接変更しないでください。理由は詳しく説明しません。

line36:

hasTooManyLoginAttempts メソッド。アカウントのログイン試行回数が設定された最大値に達したかどうかを確認するために使用されます。

このメソッドは、Illuminate\Foundation\Auth\ThrottlesLogins の特性を参照します。特性名を見ると、それが暴力的なログインを回避する役割を担っていることが推測できます。上の図の

Limiter() は、アプリ サービス コンテナーによって作成された RateLimiter オブジェクト (名前が示すとおり、周波数リミッター) を返します。このオブジェクトは、Illuminate\Cache\RateLimiter ファイルから生成されます。

このオブジェクトの場所からわかるように、このオブジェクトはログイン数を処理するために Laravel キャッシュ メカニズムを使用します。

したがって、上の図の hasTooManyLoginAttempts メソッドは、RateLimiter オブジェクトの tooManyAttempts メソッドを呼び出してログイン数を確認します。

tooManyAttempt メソッドには 3 つのパラメーターがあります。 :

$key

: 現在のアカウントのログイン番号を保存するために cacche によって使用される対応するキー。キーの構成は次のようになります:

したがって、キーの値はおおよそ次のようになります: "email|101:10:45:12"。ここからブルートフォースクラッキング防止にはIPを利用していることが分かります。もちろん、IP を変更しても再度ログインを試みることはできます。常に制限はありますが、それでも裸でいるよりははるかにマシです。

$maxAttempts

: ログイン試行の最大回数の設定値。

この値はカスタマイズできます。LoginController にカスタム maxAttempts 属性を書き込むことができます。デフォルトは 5 回です:

$decayMinutes:

最大試行回数に達した後にログインを再開するまでの待ち時間 (分)。

この値はカスタマイズ可能です。LoginController でこのプロパティをカスタマイズします。デフォルトは 1 分です:

RateLimiter::tooManyAttempts メソッドに戻ります。現在のログイン回数が設定値に達したかどうかを判定し、設定値に達していても最終ログイン禁止時間内であればtrueを返し、現在のユーザー(IP)がまだログイン禁止であることを示します。ログイン中。

下の図の赤いボックスは、$key.':timer' 値がキャッシュに存在するかどうかを判断するために使用されます。この値は、有効期限として上記の $decayMinutes 時間を使用するため、この値の存在は値はログイン状態を復元するためのキーです。

キャッシュ値が存在しない場合、現在のユーザーはログインできます。この時点で、resetAttempts メソッドは $key キャッシュされたログイン時間の値をクリアし、ゼロから記録を開始します。

コード実行権限は、再び Illuminate\Foundation\Auth\AuthenticatesUsers の 36 行目に戻ります:

hasTooManyLoginAttempts が true を返すと、Lockout イベントが開始され、LockoutResponse 応答が返されます。ユーザーは、ロックアウト イベント モニターを生成して、ログイン ログの記録など、イベントに関連するロジックを処理できます。

LockoutResponse 応答は基本的に検証例外をスローします。これは Laravel によって 423 ステータス コードと auth.throttle 設定情報を伴う応答として自動的に解釈されます。この設定の元の言語は /resources/lang/en/auth.php にあります。ユーザーは独自の言語情報をカスタマイズできます。

次に、Illuminate\Foundation\Auth\AuthenticatesUsers の 42 行目に戻り、ログイン検証の実行を開始します。

attemptLogin メソッドは config/auth.php を渡します。ガード名を構成し、対応するガード オブジェクトを生成して、そのオブジェクトのログイン検証試行を呼び出します。

Laravel5 ガードは現在、SessionGuard と tokenGuard の 2 つのタイプをサポートしています。両方とも Illuminate\Auth フォルダーに保存され、両方とも Illuminate\Contracts\Auth\Guard に実装されています。したがって、ウォッチャーをカスタマイズする必要がある場合は、このインターフェースを実装してください。
Web ガードを実装する場合は、Illuminate\Contracts\Auth\StatefulGuard インターフェイスをさらに実装できます。

どの状況でどのガードを使用するかについては、すべて config/auth.php で設定されます。

今回分析したのは Web なので、ログイン プロセスなので、Illuminate\Auth\sessionGuard の試行メソッドを確認してください:

# 行 351: この行の機能は、構成されたプロバイダー プロバイダーを通じてアカウント情報を取得することです。 。プロバイダーにも、DatabaseUserProvider と EloquentUserProvider の 2 種類があります。ファイルは /Illuminate/Auth にあります。

使用する特定のプロバイダーは、config/auth.php のプロバイダー パラメーターを通じて構成されます。構成後、使用するプロバイダーを 'guards' パラメーターで指定する必要もあります。プロバイダーは基本的に、データベース アカウント テーブルをクエリする方法を提供します。データベースはデータベース Db ファサードを直接使用してクエリを実行しますが、eloquent はモデルを使用してクエリを実行します。

Laravel はデフォルトで EloquentUserProvider を使用します。retrieveByCredentials メソッドを見ると、ユーザー情報がアカウント名によって直接取得されていることは明らかです。 Illuminate\Auth\sessionGuard の try メソッドと 356 行目の hasValidCredentials メソッドで、前の手順のユーザー情報が正常に取得できた場合、パスワードを検証します。

hasValidCredentials メソッド本体からわかるように、パスワード検証のためにプロバイダーの validateCredentials メソッドを呼び出します。 EloquentUserProvider::validateCredentials メソッドを確認してください:

この検証メソッドは、HasherContract コントラクトによって実装されたハッシュ クラスの check メソッドを使用します。特定の実装クラスは、Illuminate\Hashing\BcryptHasher です。このクラスの check メソッドを見てみましょう:

明らかに、このクラスは、password_verify 関数を使用して、入力されたプレーンテキストのパスワードをハッシュ化されたパスワードの値と比較します。これには、データベースのパスワードがpassword_hashを使用してハッシュされている必要があります。

パスワードの検証が成功した場合は、true を返します。 sessionGuard に戻り、行 357 のログイン メソッドを実行して、セッションと Cookie のログイン ステータスを記録します。

保存されたセッションのキーと値は次のとおりです:

'key'=>'login_session_'.sha1(static::class) // static::class は sessionGuard クラス自体を参照します。

'value'=>現在のユーザーの主キー値

remember_me オプションが使用される場合、次の Cookie が保存されます。キーと値は次のとおりです。

'key'=>''remember_session_'.sha1(static::class) //static::class は sessionGuard クラス自体を参照します

'value'=>ユーザーの主キー値 .'|'.保存された最新の記憶されたトークン値。'|'.ユーザーのパスワード ハッシュ値

この時点で、ユーザーは正常にログインしており、実行ポイント最後に Illuminate\Foundation\Auth\AuthenticatesUsers の 42 行目に戻り、attemptLogin が実行されて true が返された後、sendLoginResponse メソッドが呼び出されて、ログイン後のメイン ページまたは最後のログイン ページにジャンプします。

認証されたメソッドは空のメソッドであることに注意してください。このメソッドを LoginController で再定義して、ログイン後に他のロジックにジャンプして処理する方法をカスタマイズできます。

ログインが失敗した場合は、Illuminate\Foundation\Auth\AuthenticatesUsers の incrementLoginAttempts($request) メソッドを実行して、ログイン失敗の数を増やします。回数を増やす方法は、RateLimiterクラスのhit()メソッドを間接的に呼び出す方法もあります。
最後に sendFailedLoginResponse を呼び出して、ログイン例外を返します。

最後に、タイミング図を添付します。図面は平均的です。一部の UML 概念が十分に理解されていません。申し訳ありません:

以上です。この記事の内容はすべて、皆様の学習に役立つことを願っています。さらに関連する内容については、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

Laravel の Eloquent モデルの紹介

Wamp を使用して Php ローカル開発環境と HBuilder のデバッグを構築する方法

以上がLaravel5の高速認証ロジックフローの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。