この記事では主にLaravelのユーザー認証システム(基礎入門)を紹介していますが、これは参考になると思いますので、皆さんにも共有しておきますので、必要な方は参考にしてください
Laravel を使用したことのある開発者は、Laravel には基本的なユーザー登録、ログイン、認証、およびパスワードの取得を提供する認証システムが付属していることを知っていますが、認証システムによって提供される基本的な機能がニーズを満たさない場合でも、これらの基本機能を拡張すると非常に便利です。この記事では、まず Laravel Auth システムのコアコンポーネントを見ていきます。
認証システムの中核は、Laravel の認証コンポーネントの「ガーディアン」と「プロバイダー」で構成されます。ウォッチャーは、各リクエストでユーザーを認証する方法を定義します。たとえば、Laravel 独自のセッション ガードは、セッション ストレージと Cookie を使用して状態を維持します。
名前 |
関数 |
Auth |
AuthManager のファサード |
AuthManager |
Auth 認証システムの外部インターフェイス。認証システムが提供する アプリケーションは、Auth ユーザー認証に関連するすべてのメソッドを提供し、認証メソッドの特定の実装の詳細は、アプリケーションが表す特定のガード (Guard) によって完了します。 |
#Guard | Guard、各リクエストでユーザーを認証する方法を定義します |
ユーザープロバイダー | ユーザープロバイダー、永続ストレージ データからユーザーを取得する方法を定義します |
この記事では、これらのコア コンポーネントを詳細に紹介し、各コンポーネントの詳細を記事の最後にある上記の表に更新します。
認証システムの使用を開始します
新しい Laravel アプリケーションで php Artisan make:auth
および php Artisan Migrate
コマンドを実行するだけです。 、認証システムに必要なビューとデータ テーブルがプロジェクト内に生成されます。
php 職人 make:auth
実行後、Auth 認証システムに必要なビューファイルが生成され、さらに応答ルートがルーティングファイル web に追加されます.php
:
Auth
routes
静的メソッドは、Facade ファイル
public static function routes()
{
static::$app->make('router')->auth();
}
ログイン後にコピー
で個別に定義されているため、特定のルーティング メソッドは\Routing\Router の
auth メソッドでは、#Illuminate で定義されています。ファサードの実際のクラスを見つける方法については、ファサードのソース コード分析に関する前の章を参照してください。クラスプロキシ。
namespace Illuminate\Routing;
class Router implements RegistrarContract, BindingRegistrar
{
/**
* Register the typical authentication routes for an application.
*
* @return void
*/
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
}
}
ログイン後にコピー
auth メソッドでは、ルーティング URI と、認証システムで提供されるすべての機能の対応するコントローラーおよびメソッドを明確に確認できます。
Laravel の認証システムを使用すると、ほぼすべてがすでに設定されています。その構成ファイルは config/auth.php にあり、認証サービスの動作を調整するための明確にコメントされた構成オプションが含まれています。
<?php
return [
/*
|--------------------------------------------------------------------------
| 认证的默认配置
|--------------------------------------------------------------------------
|
| 设置了认证用的默认"看守器"和密码重置的选项
|
*/
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| 定义项目使用的认证看守器,默认的看守器使用session驱动和Eloquent User 用户数据提供者
|
| 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
|
| Supported: "session", "token"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
|
| Laravel支持通过不同的Guard来认证用户,这里可以定义Guard的用户数据提供者的细节:
| 使用什么driver以及对应的Model或者table是什么
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
|--------------------------------------------------------------------------
| 重置密码相关的配置
|--------------------------------------------------------------------------
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],
],
];
ログイン後にコピー
認証システムの中核は、Laravel の認証コンポーネントの「ガーディアン」と「プロバイダー」で構成されます。ウォッチャーは、各リクエストでユーザーを認証する方法を定義します。たとえば、Laravel の組み込み session ウォッチャーは、セッション ストレージと Cookie を使用して状態を維持します。
プロバイダーは、永続ストレージ データからユーザーを取得する方法を定義します。 Laravel には、Eloquent とデータベース クエリ ビルダーを使用したユーザーの取得のサポートが付属しています。もちろん、必要に応じて他のプロバイダーをカスタマイズできます。 つまり、上記の設定ファイルは、Laravel 認証システムがデフォルトで Web ガード設定項目を使用することを意味します。設定項目で使用されるガードは SessionGuard で、使用されるユーザープロバイダーは EloquentProvider## によって提供されます。 # サーバーで使用されるモデルは App\User
です。
ガード
ガードは、各リクエストでユーザーを認証する方法を定義します。 Laravel に付属の認証システムは、デフォルトで組み込みの
SessionGuard を使用します。SessionGuard
\Illuminate\Contracts\Auth
コントラクト内のメソッドの実装に加えて、 、コントラクト内の Illuminate \Contracts\Auth\StatefulGuard
メソッドと Illuminate\Contracts\Auth\SupportsBasicAuth
メソッドも実装します。これらのガード コントラクトで定義されているメソッドは、デフォルトで定義されている基本的なメソッドです。 Laravel Auth システムが依存する認証方法。
まず、これらの基本メソッドがどのような操作を実行することを目的としているかを見てみましょう。次に、Laravel が SessionGuard を介してユーザーを認証する方法を分析するときに、これらのメソッドの具体的な実装について理解します。
IlluminateContractsAuthGuard
このファイルは基本認証メソッドを定義します
namespace Illuminate\Contracts\Auth;
interface Guard
{
/**
* 返回当前用户是否时已通过认证,是返回true,否者返回false
*
* @return bool
*/
public function check();
/**
* 验证是否时访客用户(非登录认证通过的用户)
*
* @return bool
*/
public function guest();
/**
* 获取当前用户的用户信息数据,获取成功返回用户User模型实例(\App\User实现了Authenticatable接口)
* 失败返回null
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function user();
/**
* 获取当前认证用户的用户ID,成功返回ID值,失败返回null
*
* @return int|null
*/
public function id();
/**
* 通过credentials(一般是邮箱和密码)验证用户
*
* @param array $credentials
* @return bool
*/
public function validate(array $credentials = []);
/**
* 将一个\App\User实例设置成当前的认证用户
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @return void
*/
public function setUser(Authenticatable $user);
}
ログイン後にコピー
IlluminateContractsAuthStatefulGuard
このコントラクトは、Laravel 認証システムでユーザーを認証するために使用されるメソッドを定義します。ユーザーの認証に加えて、ユーザー認証が成功した後にユーザーの認証ステータスを保持する方法も含まれます。
<?php
namespace Illuminate\Contracts\Auth;
interface StatefulGuard extends Guard
{
/**
* Attempt to authenticate a user using the given credentials.
* 通过给定用户证书来尝试认证用户,如果remember为true则在一定时间内记住登录用户
* 认证通过后会设置Session和Cookies数据
* @param array $credentials
* @param bool $remember
* @return bool
*/
public function attempt(array $credentials = [], $remember = false);
/**
* 认证用户,认证成功后不会设置session和cookies数据
*
* @param array $credentials
* @return bool
*/
public function once(array $credentials = []);
/**
* 登录用户(用户认证成功后设置相应的session和cookies)
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param bool $remember
* @return void
*/
public function login(Authenticatable $user, $remember = false);
/**
* 通过给定的用户ID登录用户
*
* @param mixed $id
* @param bool $remember
* @return \Illuminate\Contracts\Auth\Authenticatable
*/
public function loginUsingId($id, $remember = false);
/**
* 通过给定的用户ID登录用户并且不设置session和cookies
*
* @param mixed $id
* @return bool
*/
public function onceUsingId($id);
/**
* Determine if the user was authenticated via "remember me" cookie.
* 判断用户是否时通过name为"remeber me"的cookie值认证的
* @return bool
*/
public function viaRemember();
/**
* 登出用户
*
* @return void
*/
public function logout();
}
ログイン後にコピー
IlluminateContractsAuthSupportsBasicAuth
HTTP Basic Auth を介してユーザーを認証する方法を定義します
namespace Illuminate\Contracts\Auth;
interface SupportsBasicAuth
{
/**
* 尝试通过HTTP Basic Auth来认证用户
*
* @param string $field
* @param array $extraConditions
* @return \Symfony\Component\HttpFoundation\Response|null
*/
public function basic($field = 'email', $extraConditions = []);
/**
* 进行无状态的Http Basic Auth认证 (认证后不会设置session和cookies)
*
* @param string $field
* @param array $extraConditions
* @return \Symfony\Component\HttpFoundation\Response|null
*/
public function onceBasic($field = 'email', $extraConditions = []);
}
ログイン後にコピー
ユーザー プロバイダー
ユーザー プロバイダーは、永続性を取得する方法を定義します。 Laravel は保存されたデータからユーザーを抽出し、ユーザープロバイダーコントラクト (インターフェース) を定義します。すべてのユーザープロバイダーは、このインターフェースで定義された抽象メソッドを実装する必要があります。統一されたインターフェースが実装されるため、Laravel 独自のものでもカスタマイズされたものでも、すべてのユーザープロバイダーを使用できます。ガード。
ユーザー プロバイダー コントラクト
ユーザー プロバイダーが実装する必要がある、コントラクトで定義されている抽象メソッドを次に示します。
<?php
namespace Illuminate\Contracts\Auth;
interface UserProvider
{
/**
* 通过用户唯一ID获取用户数据
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier);
/**
* Retrieve a user by their unique identifier and "remember me" token.
* 通过Cookies中的"remeber me"令牌和用户唯一ID获取用户数据
* @param mixed $identifier
* @param string $token
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByToken($identifier, $token);
/**
* 更新数据存储中给定用户的remeber me令牌
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string $token
* @return void
*/
public function updateRememberToken(Authenticatable $user, $token);
/**
* 通过用户证书获取用户信息
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials);
/**
* 验证用户的证书
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(Authenticatable $user, array $credentials);
}
ログイン後にコピー
構成ファイルを通じて
config/ auth.php Laravel で使用されるデフォルトのユーザープロバイダーは Illuminate\Auth\EloquentUserProvider
であることがわかります。次の章では、Laravel Auth システムの実装の詳細を分析するときに、 EloquentUserProvider
ユーザー プロバイダー コントラクトに抽象メソッドを実装する方法を参照してください。
概要
このセクションでは、主に、認証システムのコアコンポーネントであるガーディアンとプロバイダーを含む、Laravel 認証システムの基本を紹介します。構成ファイルで指定されます。認証プロセスで必要なユーザー データは、ユーザー プロバイダーを通じてガードによって取得されます。次の表は、認証システムのコア コンポーネントと各コンポーネントの役割をまとめたものです。
#名前 | 機能 |
##Auth
AuthManager のファサード |
|
AuthManager
Auth 認証システムの外部向けインターフェイス。認証システムはこれを通じて、すべての Auth ユーザー認証関連メソッドをアプリケーションに提供し、その具体的な実装の詳細を提供します。認証方法はそれによって表され、特定のガード (Guard) を使用して完了します。 |
|
Guard
Guard は、各リクエストでユーザーを認証する方法を定義します。認証に必要なユーザー データは、ユーザー データ プロバイダーを通じて取得されます。 |
|
ユーザー プロバイダー
ユーザー プロバイダーは、永続ストレージ データからユーザーを取得する方法を定義します。Guard がユーザーを認証するとき、プロバイダーを通じてユーザーのデータを取得します。すべてのプロバイダーIlluminateContractsAuthUserProvider インターフェイスの実装であり、永続ストレージからユーザー データを取得するための特定の実装の詳細を提供します。 |
|
#次の章では、Laravel 独自のユーザー認証機能の実装の詳細を見ていきます。
上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
Laravel ユーザー認証システムの実装の詳細
Laravel WeChat アプレットはユーザーの詳細を取得し、分析を提供します。パラメータ アプレット コード拡張の #