最近laravelフレームワークを勉強しているので、次の記事ではLaravelの認証原理と完全にカスタマイズされた認証についての関連情報を中心に、サンプルコードを交えて詳しく紹介していますので、必要な方は参考にしてください。以下はエディターと一緒に学ぼう
まえがき
Laravelのデフォルトの認証機能はすでに非常に包括的ですが、よく遭遇します。ユーザー名と電子メール認証を同時に満たす必要があるなど、検証フィールドがデフォルトのものと一致しないなど、カスタマイズが必要な状況があります。完全にカスタムの証明書を作成するにはどうすればよいですか?チュートリアルではなく、自分で簡単に変更したりカスタマイズしたりできるように、動作原理を紹介することを好みます。
Authenticatable インターフェイス
Illuminate\Contracts\Auth\Authenticatable
Authenticatable は、認証に使用できるモデルを定義します。またはクラスが実装する必要があるインターフェイス。つまり、認証にカスタム クラスを使用する必要がある場合は、このインターフェイスで定義されたメソッドを実装する必要があります。
// 获取唯一标识的,可以用来认证的字段名,比如 id,uuid public function getAuthIdentifierName(); // 获取该标示符对应的值 public function getAuthIdentifier(); // 获取认证的密码 public function getAuthPassword(); // 获取remember token public function getRememberToken(); // 设置 remember token public function setRememberToken($value); // 获取 remember token 对应的字段名,比如默认的 'remember_token' public function getRememberTokenName();
たとえば、認証モデルでは、パスワード検証として「パスワード」ではなく「トークン」を使用する必要があります。このとき、戻り値を変更できます。 getAuthPassword() メソッド。値は 'token';
Authenticatable trait
Illuminate\Auth\Authenticatable
Authenticatable trait Laravelで定義されているのは、デフォルトのUserモデルで使用されるLaravel auth Traitでもあり、このトレイトはUserモデルのデフォルトの認証識別子を「id」、パスワードフィールドを「password」、記憶トークンに対応するフィールドをremember_tokenとして定義します。すぐ。
一部の設定は、User モデルのこれらのメソッドをオーバーライドすることで変更できます。
Guard インターフェイス
Illuminate\Contracts\Auth\Guard
Guard インターフェイスは、Authenticatable (認証可能) を実装する実装を定義します。 ) モデルまたはクラスの認証メソッドといくつかの共通インターフェイス。
// 判断当前用户是否登录 public function check(); // 判断当前用户是否是游客(未登录) public function guest(); // 获取当前认证的用户 public function user(); // 获取当前认证用户的 id,严格来说不一定是 id,应该是上个模型中定义的唯一的字段名 public function id(); // 根据提供的消息认证用户 public function validate(array $credentials = []); // 设置当前用户 public function setUser(Authenticatable $user);
StatefulGuard インターフェイス
Illuminate\Contracts\Auth\StatefulGuard
StatefulGuard インターフェイスは、Guard 内部を除き、Guard インターフェイスから継承します。定義されたいくつかの基本的なインターフェイスに加えて、さらにステートフルな Guard も追加されました。
新しく追加されたインターフェイスには次のものが含まれます:
// 尝试根据提供的凭证验证用户是否合法 public function attempt(array $credentials = [], $remember = false); // 一次性登录,不记录session or cookie public function once(array $credentials = []); // 登录用户,通常在验证成功后记录 session 和 cookie public function login(Authenticatable $user, $remember = false); // 使用用户 id 登录 public function loginUsingId($id, $remember = false); // 使用用户 ID 登录,但是不记录 session 和 cookie public function onceUsingId($id); // 通过 cookie 中的 remember token 自动登录 public function viaRemember(); // 登出 public function logout();
Laravelデフォルトでは、RequestGuard、TokenGuard、SessionGuard の 3 つのガードが提供されます。
RequestGuard
Illuminate\Auth\RequestGuard
RequestGuard は非常に単純なガードです。 .RequestGuard はクロージャを渡すことによって認証されます。 Auth::viaRequest.
SessionGuard
Illuminate\Auth\SessionGuard
SessionGuard は Laravel Web のデフォルトです。認証ガード。
#TokenGuard#Illuminate\Auth\TokenGuard
TokenGuard は、トークン認証によるステートレス API 認証に適しています。
UserProvider インターフェイスIlluminate\Contracts\Auth\UserProvider
UserProvider インターフェイスは、認証モデルを取得する方法 (モデル ベースの取得など) を定義します。 ID に基づいて、電子メールに基づいてモデルを取得するなど。
// 通过唯一标示符获取认证模型 public function retrieveById($identifier); // 通过唯一标示符和 remember token 获取模型 public function retrieveByToken($identifier, $token); // 通过给定的认证模型更新 remember token public function updateRememberToken(Authenticatable $user, $token); // 通过给定的凭证获取用户,比如 email 或用户名等等 public function retrieveByCredentials(array $credentials); // 认证给定的用户和给定的凭证是否符合 public function validateCredentials(Authenticatable $user, array $credentials);
Laravel にはデフォルトで 2 つのユーザープロバイダーがあります: DatabaseUserProvider と EloquentUserProvider。
DatabaseUserProvider
Illuminate\Auth\DatabaseUserProvider
データベース テーブルから直接認証モデルを取得します。
EloquentUserProviderIlluminate\Auth \EloquentUserProvider
eloquent モデルを通じて認証モデルを取得する
AuthManagerIlluminate\Auth\AuthManager
Guard はユーザーが認証に成功したかどうかを認証するために使用され、UserProvider は認証モデルのソースを提供するために使用され、ガードの管理やプロジェクトの構成に応じたガードのカスタマイズなどの機能は AuthManager を通じて実装されます。
AuthManager は、ストラテジ パターンの Context クラスとファクトリ メソッドのファクトリに少し似ている必要があります。一方では Guard を管理し、他方では特定のストラテジ (Guard ) メソッドを __call マジック メソッド経由で呼び出します。
Auth ファサードの対応する実装クラスは AuthManager です。AuthManager はコンテナ内にシングルトンとして登録され、すべてのガード、ユーザー プロバイダー、およびガード プロキシの作業を管理するために使用されます。
カスタム認証上記の知識に基づいて、認証をカスタマイズするのは非常に簡単であることがわかります。
#認証モデルの作成#カスタム認証モデルを作成し、Authenticatable インターフェイスを実装します;
添加 guard creator 和 user provider creator 到 AuthManager 中
在 AppServiceProvider 的 boot 方法添加如下代码:
Auth::extend('myguard', function(){ ... return new MyGuard(); //返回自定义 guard 实例 ... }); Auth::provider('myuserprovider', function(){ return new MyUserProvider(); // 返回自定义的 user provider });
在 config\auth.php的 guards 数组中添加自定义 guard,一个自定义 guard 包括两部分: driver 和 provider.
'oustn' => [ 'driver' => 'myguard', 'provider' => 'myusers', ],
在 config\auth.php的 providers 数组中添加自定义 user provider.
'myusers' => [ 'driver' => 'myuserprovider' // 里面具体的字段可以根据你创建 user provider 需要的信息自由添加,可以通过 Auth::createUserProvider('myuserprovider') 创建 ],
设置 config\auth.php 的 defaults.guard 为 oustn.
以上がLaravel 認証原理の PHP 例と完全にカスタマイズされた認証の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。