使用过Laravel的开发者都知道,Laravel自带了一个认证系统来提供基本的用户注册、登陆、认证、找回密码,若是Auth系统里提供的基础功能不知足需求还能够很方便的在这些基础功能上进行扩展。这篇文章咱们先来了解一下Laravel Auth系统的核心组件。php
Auth系统的核心是由 Laravel 的认证组件的「看守器」和「提供器」组成。看守器定义了该如何认证每一个请求中用户。例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。git
下表列出了Laravel Auth系统的核心部件github
名称 | 做用 |
---|---|
Auth | AuthManager的Facade |
AuthManager | Auth认证系统面向外部的接口,认证系统经过它向应用提供全部Auth用户认证相关的方法,而认证方法的具体实现细节由它代理的具体看守器(Guard)来完成。 |
Guard | 看守器,定义了该如何认证每一个请求中用户 |
User Provider | 用户提供器,定义了如何从持久化的存储数据中检索用户 |
在本文中咱们会详细介绍这些核心部件,而后在文章的最后更新每一个部件的做用细节到上面给出的这个表中。web
只需在新的 Laravel 应用上运行 php artisan make:auth
和 php artisan migrate
命令就可以在项目里生成Auth系统须要的路由和视图以及数据表。数据库
php artisan make:auth
执行后会生成Auth认证系统须要的视图文件,此外还会在路由文件web.php
中增长响应的路由:api
Auth::routes();
Auth
Facade文件中单独定义了routes
这个静态方法cookie
public static function routes() { static::$app->make('router')->auth(); }
因此Auth具体的路由方法都定义在Illuminate\Routing\Router
的auth
方法中,关于如何找到Facade类代理的实际类能够翻看以前Facade源码分析的章节。session
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以及对应的控制器和方法。app
使用Laravel的认证系统,几乎全部东西都已经为你配置好了。其配置文件位于 config/auth.php
,其中包含了用于调整认证服务行为的注释清晰的选项配置。ide
<?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, ], ], ];
Auth系统的核心是由 Laravel 的认证组件的「看守器」和「提供器」组成。看守器定义了该如何认证每一个请求中用户。例如,Laravel 自带的 session
看守器会使用 session 存储和 cookies 来维护状态。
提供器中定义了该如何从持久化的存储数据中检索用户。Laravel 自带支持使用 Eloquent 和数据库查询构造器来检索用户。固然,你能够根据须要自定义其余提供器。
因此上面的配置文件的意思是Laravel认证系统默认使用了web guard配置项, 配置项里使用的是看守器是SessionGuard,使用的用户提供器是EloquentProvider
提供器使用的model是App\User
。
看守器定义了该如何认证每一个请求中用户。Laravel自带的认证系统默认使用自带的 SessionGuard
,SessionGuard
除了实现\Illuminate\Contracts\Auth
契约里的方法还实现Illuminate\Contracts\Auth\StatefulGuard
和Illuminate\Contracts\Auth\SupportsBasicAuth
契约里的方法,这些Guard Contracts里定义的方法都是Laravel Auth系统默认认证方式依赖的基础方法。
咱们先来看一下这一些基础方法都意欲完成什么操做,等到分析Laravel是如何经过SessionGuard认证用户时在去关系这些方法的具体实现。
这个文件定义了基础的认证方法
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); }
这个Contracts定义了Laravel auth系统里认证用户时使用的方法,除了认证用户外还会涉及用户认证成功后如何持久化用户的认证状态。
<?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(); }
定义了经过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定义了用户提供器契约(interface),全部用户提供器都要实现这个接口里定义的抽象方法,由于实现了统一的接口因此使得不管是Laravel 自带的仍是自定义的用户提供器都可以被Guard使用。
以下是契约中定义的必需被用户提供器实现的抽象方法:
<?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系统的基础,包括Auth系统的核心组件看守器和提供器,AuthManager经过调用配置文件里指定的看守器来完成用户认证,在认证过程须要的用户数据是看守器经过用户提供器获取到的,下面的表格里总结了Auth系统的核心部件以及每一个部件的做用。
名称 | 做用 |
---|---|
Auth | AuthManager的Facade |
AuthManager | Auth认证系统面向外部的接口,认证系统经过它向应用提供全部Auth用户认证相关的方法,而认证方法的具体实现细节由它代理的具体看守器(Guard)来完成。 |
Guard | 看守器,定义了该如何认证每一个请求中用户,认证时须要的用户数据会经过用户数据提供器来获取。 |
User Provider | 用户提供器,定义了如何从持久化的存储数据中检索用户,Guard认证用户时会经过提供器取用户的数据,全部的提供器都是IlluminateContractsAuthUserProvider接口的实现,提供了从持久化存储中取用户数据的具体实现细节。 |
下一章节咱们会看看Laravel自带的用户认证功能的实现细节。
本文已经收录在系列文章Laravel源码学习里,欢迎访问阅读。