ホームページ  >  記事  >  バックエンド開発  >  Laravel 認証原理の PHP 例と完全にカスタマイズされた認証の詳細な説明

Laravel 認証原理の PHP 例と完全にカスタマイズされた認証の詳細な説明

无忌哥哥
无忌哥哥オリジナル
2018-07-12 14:28:112416ブラウズ

最近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

データベース テーブルから直接認証モデルを取得します。

EloquentUserProvider

Illuminate\Auth \EloquentUserProvider

eloquent モデルを通じて認証モデルを取得する

AuthManager

Illuminate\Auth\AuthManager

Guard はユーザーが認証に成功したかどうかを認証するために使用され、UserProvider は認証モデルのソースを提供するために使用され、ガードの管理やプロジェクトの構成に応じたガードのカスタマイズなどの機能は AuthManager を通じて実装されます。

AuthManager は、ストラテジ パターンの Context クラスとファクトリ メソッドのファクトリに少し似ている必要があります。一方では Guard を管理し、他方では特定のストラテジ (Guard ) メソッドを __call マジック メソッド経由で呼び出します。

Auth ファサードの対応する実装クラスは AuthManager です。AuthManager はコンテナ内にシングルトンとして登録され、すべてのガード、ユーザー プロバイダー、およびガード プロキシの作業を管理するために使用されます。

カスタム認証上記の知識に基づいて、認証をカスタマイズするのは非常に簡単であることがわかります。

#認証モデルの作成
  • #カスタム認証モデルを作成し、Authenticatable インターフェイスを実装します;

# #カスタム UserProvider の作成

  • #カスタム UserProvider を作成し、UserProvider インターフェイスを実装し、上記のカスタム認証モデルを返します。

# カスタム Guard を作成する

  • カスタム Guard を作成し、Guard または StatefulGuard インターフェイスを実装します

    • 添加 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 サイトの他の関連記事を参照してください。

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