Laravelのコアは、基本的な認証を簡単に実装できる強力な認証システムを提供します。認証システムの足場を構築するために、いくつかの職人コマンドを実行するだけです。
さらに、システムは、カスタム認証アダプターの拡張と挿入を可能にするように設計されています。この記事では、これについて詳しく説明します。カスタム認証ガードの実装に飛び込む前に、まずLaravel認証システムの基本要素であるガードとプロバイダーについて説明します。
コア要素:ガードとプロバイダー
Laravel認証システムのコアは、ガードとプロバイダーの2つの要素で構成されています。ガードは、認証されたユーザーを識別するために使用される論理プロバイダーとして理解できます。 Laravel Coreは、セッションやトークンなどのさまざまなガードを提供します。セッションガードは、Cookieを介して各リクエストのユーザーステータスを維持し、トークンガードは各リクエストで有効なトークンをチェックすることでユーザーを認証します。
この記事の後半でガードが実装されます。これは、リクエストヘッダーの特定のJSONパラメーターをチェックし、MongoDBバックエンドから有効なユーザーを取得します。
プロバイダー
ガードが認証のロジックを定義する場合、認証プロバイダーはバックエンドストレージからユーザーを取得する責任があります。ガードがユーザーをバックエンドストレージに対して認証する必要がある場合、検索ユーザーの実装が認証プロバイダーに含まれています。
上記は、Laravel認証システムのガードとプロバイダーへの基本的な紹介です。次のセクションから始めて、カスタム認証ガードとプロバイダーの開発に焦点を当てます!
ファイル設定の概要
この記事で実装するファイルのリストを簡単に見てみましょう。
現時点でファイルリストが明確でない場合は、心配しないでください。説明中に各ファイルについて詳しく説明します。
まず、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>
認証システムの標準によれば、ユーザーモデルを実装する必要があります。
認証プロバイダーを設定します
ファイルを作成してください
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>
このセクションでは、前のセクションで作成された認証プロバイダーと対話するガードを作成します。 retrieveByCredentials
jsondata
ファイルを作成してください
、コンテンツは次のとおりです。
最初に、クラスはを実装する必要があります。キーは、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 サイトの他の関連記事を参照してください。