ホームページ > バックエンド開発 > PHPチュートリアル > Laravelでカスタム認証ガードを作成する方法

Laravelでカスタム認証ガードを作成する方法

Lisa Kudrow
リリース: 2025-03-05 10:02:09
オリジナル
699 人が閲覧しました

How to Create a Custom Authentication Guard in Laravel

この記事では、コア認証システムを拡張してカスタム認証ガードを作成する方法に焦点を当てた、Laravelフレームワークの認証システムを詳細に調査します。

Laravelのコアは、基本的な認証を簡単に実装できる強力な認証システムを提供します。認証システムの足場を構築するために、いくつかの職人コマンドを実行するだけです。

さらに、システムは、カスタム認証アダプターの拡張と挿入を可能にするように設計されています。この記事では、これについて詳しく説明します。カスタム認証ガードの実装に飛び込む前に、まずLaravel認証システムの基本要素であるガードとプロバイダーについて説明します。

コア要素:ガードとプロバイダー

Laravel認証システムのコアは、ガードとプロバイダーの2つの要素で構成されています。

ガード

ガードは、認証されたユーザーを識別するために使用される論理プロバイダーとして理解できます。 Laravel Coreは、セッションやトークンなどのさまざまなガードを提供します。セッションガードは、Cookieを介して各リクエストのユーザーステータスを維持し、トークンガードは各リクエストで有効なトークンをチェックすることでユーザーを認証します。

したがって、ガードは認証のロジックを定義し、バックエンドから有効な資格情報を取得することによって常に実装されるとは限りません。リクエストヘッダー内の特定のコンテンツを単にチェックし、このコンテンツに基づいてユーザーを認証するガードを実装できます。

この記事の後半でガードが実装されます。これは、リクエストヘッダーの特定のJSONパラメーターをチェックし、MongoDBバックエンドから有効なユーザーを取得します。

プロバイダー

ガードが認証のロジックを定義する場合、認証プロバイダーはバックエンドストレージからユーザーを取得する責任があります。ガードがユーザーをバックエンドストレージに対して認証する必要がある場合、検索ユーザーの実装が認証プロバイダーに含まれています。

Laravelには、2つのデフォルト認証プロバイダーが付属しています。データベースとEloquentです。データベース認証プロバイダーは、バックエンドストレージからユーザーの資格情報を直接取得しますが、Eloquentはこれを行うための抽象化レイヤーを提供します。

この例では、MongoDBバックエンドからユーザー資格情報を取得するMongoDB認証プロバイダーを実装します。

上記は、Laravel認証システムのガードとプロバイダーへの基本的な紹介です。次のセクションから始めて、カスタム認証ガードとプロバイダーの開発に焦点を当てます!

ファイル設定の概要

この記事で実装するファイルのリストを簡単に見てみましょう。

  • config/auth.php:これは、カスタムガードのエントリを追加する認証構成ファイルです。
  • config/mongo.php:mongodb構成を含むファイル。
  • app/services/contracts/nosqlserviceinterface.php :カスタムMongoデータベースクラスによって実装されたインターフェイス。
  • app/database/mongodatabase.php:mongodbと対話するメインデータベースクラス。
  • app/models/auth/user.php :認知可能な契約を実装するユーザーモデルクラス。
  • app/extensions/mongouserprovider.php:認証プロバイダーの実装。
  • app/services/auth/jsonguard.php :認証ガードドライバーの実装。
  • アプリ/プロバイダー/authserviceprovider.php:サービスコンテナにバインドされた既存のファイルを追加するために使用します。
  • app/http/controllers/mongocontroller.php:カスタムガードをテストするために実装するデモコントローラーファイル。

現時点でファイルリストが明確でない場合は、心配しないでください。説明中に各ファイルについて詳しく説明します。

詳細な実装

このセクションでは、必要なファイルの実装について徐々に説明します。

まず、Laravelにカスタムガードについて知らせる必要があります。以下に示すように、

config/auth.phpファイルにカスタムガードの詳細を追加してください。

<code>...<br>...<br>'guards' => [<br>    'web' => [<br>        'driver' => 'session',<br>        'provider' => 'users',<br>    ],<br><br>    'api' => [<br>        'driver' => 'token',<br>        'provider' => 'users',<br>        'hash' => false,<br>    ],<br><br>    'custom' => [<br>      'driver' => 'json',<br>      'provider' => 'mongo',<br>    ],<br>],<br>...<br>...<br></code>
ログイン後にコピー
ご覧のとおり、プロバイダーセクションにカスタムガードを追加しました。

<code>...<br>...<br>'providers' => [<br>    'users' => [<br>        'driver' => 'eloquent',<br>        'model' => App\User::class,<br>    ],<br>    'mongo' => [<br>        'driver' => 'mongo'<br>    ],<br><br>    // 'users' => [<br>    //     'driver' => 'database',<br>    //     'table' => 'users',<br>    // ],<br>],<br>...<br>...<br></code>
ログイン後にコピー
Web内のユーザーモデルにプロバイダーエントリを追加しました。

認証システムの標準によれば、ユーザーモデルを実装する必要があります。

認証プロバイダーを設定します

前述のように、Laravel認証システムは、ガードとプロバイダーの2つの要素で構成されています。

このセクションでは、バックエンドからユーザーの取得を担当する認証プロバイダーを作成します。

ファイルを作成してください

app/extensions/mongouserprovider.php

、コンテンツは次のとおりです。

同様に、カスタムプロバイダーが

と前述のユーザーモデルクラスを実装する必要があることを確認する必要があります。一方、
<?php <br?>// app/Extensions/MongoUserProvider.php<br></br>namespace App\Extensions;<br></br><br></br>use Illuminate\Support\Str;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class MongoUserProvider implements UserProvider<br></br>{<br></br>  /**<br></br>   * The Mongo User Model<br></br>   */<br></br>  private $model;<br></br><br></br>  /**<br></br>   * Create a new mongo user provider.<br></br>   *<br></br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br></br>   * @return void<br></br>   */<br></br>  public function __construct(\App\Models\Auth\User $userModel)<br></br>  {<br></br>    $this->model = $userModel;<br>  }<br><br>  /**<br>   * Retrieve a user by the given credentials.<br>   *<br>   * @param  array  $credentials<br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br>   */<br>  public function retrieveByCredentials(array $credentials)<br>  {<br>      if (empty($credentials)) {<br>          return;<br>      }<br><br>    $user = $this->model->fetchUserByCredentials(['username' => $credentials['username']]);<br><br>      return $user;<br>  }<br><br>  /**<br>   * Validate a user against the given credentials.<br>   *<br>   * @param  \Illuminate\Contracts\Auth\Authenticatable  $user<br>   * @param  array  $credentials  Request credentials<br>   * @return bool<br>   */<br>  public function validateCredentials(Authenticatable $user, Array $credentials)<br>  {<br>      return ($credentials['username'] == $user->getAuthIdentifier() &&<br>    md5($credentials['password']) == $user->getAuthPassword());<br>  }<br><br>  public function retrieveById($identifier) {}<br><br>  public function retrieveByToken($identifier, $token) {}<br><br>  public function updateRememberToken(Authenticatable $user, $token) {}<br>}<br>
ログイン後にコピー
要求パラメーターには、資格情報のJSONエンコードされた文字列を含める必要があります。

このセクションでは、前のセクションで作成された認証プロバイダーと対話するガードを作成します。 retrieveByCredentials jsondataファイルを作成してください

app/services/auth/jsonguard.php

、コンテンツは次のとおりです。

最初に、クラスはを実装する必要があります。キーは、CouchDB実装アダプターに以前に追加された設定を反映していることを思い出してください。この場合、ログインメソッドに対応するバインディングを追加するだけで、不正なメッセージを実装する必要があります。

一方、
<?php <br?>// app/Services/Auth/JsonGuard.php<br></br>namespace App\Services\Auth;<br></br><br></br>use Illuminate\Http\Request;<br></br>use Illuminate\Contracts\Auth\Guard;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use GuzzleHttp\json_decode;<br></br>use phpDocumentor\Reflection\Types\Array_;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class JsonGuard implements Guard<br></br>{<br></br>  protected $request;<br></br>  protected $provider;<br></br>  protected $user;<br></br><br></br>  /**<br></br>   * Create a new authentication guard.<br></br>   *<br></br>   * @param  \Illuminate\Contracts\Auth\UserProvider  $provider<br></br>   * @param  \Illuminate\Http\Request  $request<br></br>   * @return void<br></br>   */<br></br>  public function __construct(UserProvider $provider, Request $request)<br></br>  {<br></br>    $this->request = $request;<br>    $this->provider = $provider;<br>    $this->user = NULL;<br>  }<br><br>  /**<br>   * Determine if the current user is authenticated.<br>   *<br>   * @return bool<br>   */<br>  public function check()<br>  {<br>    return ! is_null($this->user());<br>  }<br><br>  /**<br>   * Determine if the current user is a guest.<br>   *<br>   * @return bool<br>   */<br>  public function guest()<br>  {<br>    return ! $this->check();<br>  }<br><br>  /**<br>   * Get the currently authenticated user.<br>   *<br>   * @return \Illuminate\Contracts\Auth\Authenticatable|null<br>   */<br>  public function user()<br>  {<br>    if (! is_null($this->user)) {<br>      return $this->user;<br>    }<br>  }<br><br>  /**<br>   * Get the JSON params from the current request<br>   *<br>   * @return string<br>   */<br>  public function getJsonParams()<br>  {<br>    $jsondata = $this->request->query('jsondata');<br><br>    return (!empty($jsondata) ? json_decode($jsondata, TRUE) : NULL);<br>  }<br><br>  /**<br>   * Get the ID for the currently authenticated user.<br>   *<br>   * @return string|null<br>  */<br>  public function id()<br>  {<br>    if ($user = $this->user()) {<br>      return $this->user()->getAuthIdentifier();<br>    }<br>  }<br><br>  /**<br>   * Validate a user's credentials.<br>   *<br>   * @return bool<br>   */<br>  public function validate(Array $credentials=[])<br>  {<br>    if (empty($credentials['username']) || empty($credentials['password'])) {<br>      if (!$credentials=$this->getJsonParams()) {<br>        return false;<br>      }<br>    }<br><br>    $user = $this->provider->retrieveByCredentials($credentials);<br><br>    if (! is_null($user) && $this->provider->validateCredentials($user, $credentials)) {<br>      $this->setUser($user);<br><br>      return true;<br>    } else {<br>      return false;<br>    }<br>  }<br><br>  /**<br>   * Set the current user.<br>   *<br>   * @param  Array $user User info<br>   * @return void<br>   */<br>  public function setUser(Authenticatable $user)<br>  {<br>    $this->user = $user;<br>    return $this;<br>  }<br>}<br>
ログイン後にコピー

に似たものを試してみてください。ユーザーがデータベースに存在する場合は、mongoメッセージを返す必要があります。

これは、カスタムガードがどのように機能するかを示すための単なる例であることに注意してください。ログインなどの機能については、完全なソリューションを実装する必要があります。実際、私はあなたがあなたのアプリケーションのための強力で安全なソリューションを構築する責任を負う責任を負うだけです。

今日の旅はここで終わり、うまくいけば、私はすぐにより有用なコンテンツをもたらすでしょう。

結論

Laravelフレームワークは、コアで強力な認証システムを提供し、カスタム認証システムを実装する場合は拡張できます。これは、この記事のトピックです。カスタムガードを実装し、それらをLaravel認証ワークフローに挿入します。

このプロセスでは、要求されたJSONペイロードに基づいてユーザーを認証し、MongoDBデータベースと一致するシステムを開発しました。これを達成するために、カスタムガードとカスタムプロバイダーの実装を作成することになりました。

この演習がLaravel認証プロセスを詳細に理解できるようになることを願っています。今、あなたはそれが内部でどのように機能するかについてより自信を持つべきです。

Laravelから始めたばかりの人、または拡張機能を通じて知識、Webサイト、またはアプリケーションを拡張したい人のために、Envato Marketで学習するための多くのリソースが利用可能です。

以上がLaravelでカスタム認証ガードを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート