当前位置: 首页 > 后端技术 > PHP

Laravel核心解读--用户认证系统(基础介绍)

时间:2023-03-29 16:34:42 PHP

用户认证系统(基础介绍)使用过Laravel的开发者都知道,Laravel自带认证系统,提供基本的用户注册、登录、认证、搜索等功能。密码恢复,如果Auth系统提供的基本功能不能满足要求,很容易在这些基本功能上进行扩展。在这篇文章中,我们来看看LaravelAuth系统的核心组件。Auth系统的核心由Laravel的身份验证组件的“守卫”和“提供者”组成。守卫定义了如何对每个请求的用户进行身份验证。例如,Laravel自带的会话守卫使用会话存储和cookie来维护状态。下表列出了LaravelAuth系统的核心组件。AuthAuthManager的FacadeAuthManager的作用是Auth认证系统的对外接口。认证系统通过它向应用程序提供所有与Auth用户认证相关的方法,认证方法的具体实现细节由它委托。守卫(Guard)来完成。Guard,它定义了如何在每个请求中对用户进行身份验证。UserProvider,它定义了如何从持久存储数据中检索用户。在本文中,我们将详细介绍这些核心组件,然后在文末逐一更新。各个组成部分的作用详见上表。要开始使用Auth系统,只需在新的Laravel应用程序上运行phpartisanmake:auth和phpartisanmigrate命令,即可在项目中生成Auth系统所需的路由、视图和数据表。执行phpartisanmake:auth后,会生成Auth认证系统需要的视图文件。另外,在路由文件web.php中会添加响应的路由:Auth::routes();在AuthFacade文件中单独定义了routes的静态方法publicstaticfunctionroutes(){static::$app->make('router')->auth();}所以Auth的具体路由方法定义在Illuminate\Routing\Router的auth方法,如何找到Facade类代理的实际类,可以参考前面Facade源码分析章节。namespaceIlluminate\Routing;classRouterimplementsRegistrarContract,BindingRegistrar{/***注册应用程序的典型身份验证路由。**@returnvoid*/publicfunctionauth(){//身份验证路由...$this->get('login','Auth\LoginController@showLoginForm')->name('login');$this->post('登录','Auth\LoginController@login');$this->post('logout','Auth\LoginController@logout')->name('logout');//注册路径...$this->get('register','Auth\RegisterController@showRegistrationForm')->name('register');$this->post('register','Auth\RegisterController@register');//密码重置路由...$this->get('password/reset','Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');$this->post('password/email','Auth\ForgotPasswordController@sendResetLinkEmail')->name('密码.email');$this->get('password/reset/{token}','Auth\ResetPasswordController@showResetForm')->name('password.reset');$this->post('密码/重置','Auth\ResetPasswordController@reset');在auth方法中可以清楚的看到认证系统中提供的所有函数的路由URI以及对应的控制器和方法。使用Laravel的认证系统,几乎所有的Everything都已经为你配置好了。它的配置文件位于config/auth.php,其中包含用于调整身份验证服务行为的经过良好注释的配置选项。['guard'=>'web','passwords'=>'users',],/*|------------------------------------------------------------------------------|身份验证卫士|--------------------------------------------------------------------------||定义项目使用的身份验证保护。默认守卫使用会话驱动和EloquentUser用户数据提供者||所有驱动程序都有一个用户提供程序,它定义了如何从应用程序使用的数据库或持久用户数据存储中检索用户信息||支持:“会话”、“令牌”|*/'guards'=>['web'=>['driver'=>'session','provider'=>'users',],'api'=>['driver'=>'token','provider'=>'users',],],/*|---------------------------------------------------------------------|用户提供者|------------------------------------------------------------------------||所有的驱动程序都有一个用户提供者,它定义了如何从数据库或应用程序中使用它从持久性用户数据的存储中提取用户信息||Laravel支持不同的Guards来验证用户,这里你可以定义Guard用户数据提供者的详细信息:|使用什么驱动,对应的Model或table是什么||支持:“数据库”、“雄辩”|*/'providers'=>['users'=>['driver'=>'eloquent','model'=>App\Models\User::class,],//'users'=>[//'driver'=>'database',//'table'=>'users',//],],/*|--------------------------------------------------------------------------|重置密码相关配置|--------------------------------------------------------------------------|*/'passwords'=>['users'=>['provider'=>'users','table'=>'password_resets','过期'=>60,],],];Auth系统的核心是由Laravel的认证组件的“守护者”和“提供者”组成。守卫定义了如何在每个请求中对用户进行身份验证。例如,Laravel自带的会话守卫使用会话存储和cookie来维护状态。提供者定义如何从持久存储中检索用户。Laravel支持使用Eloquent和数据库查询构建器检索用户。当然,您可以根据需要自定义其他提供程序。所以上面的配置文件意味着Laravel认证系统默认使用webguard配置项。配置项中使用的守卫是SessionGuard,使用的用户提供者是EloquentProvider,提供者使用的模型是App\User。守卫定义如何根据每个请求对用户进行身份验证。Laravel内置的认证系统默认使用内置的SessionGuard。除了\Illuminate\Contracts\Auth合约中的方法外,SessionGuard还实现了Illuminate\Contracts\Auth\StatefulGuard和Illuminate\Contracts\Auth\SupportsBasicAuth合约中的方法。这些GuardsContracts中定义的方法是LaravelAuth系统的默认认证方法所依赖的基本方法。我们先来看看这些基本方法是要完成哪些操作。我们在分析Laravel是如何通过SessionGuard对用户进行认证的时候,会去到这些方法的具体实现。IlluminateContractsAuthGuard文件定义了基本的认证方式namespaceIlluminate\Contracts\Auth;interfaceGuard{/***返回当前用户是否通过认证,通过则返回true,否则返回false**@returnbool*/publicfunctioncheck();/***验证是否为访客用户(未通过登录认证的用户)**@returnbool*/publicfunctionguest();/***获取当前用户的用户信息数据,获取成功返回用户UserModel实例(\App\User实现了Authenticatable接口)*失败返回null*@return\Illuminate\Contracts\Auth\可验证|null*/publicfunctionuser();/***获取当前认证用户的用户ID,成功返回ID值,失败返回null**@returnint|null*/publicfunctionid();/***通过凭据(通常是电子邮件地址和密码)对用户进行身份验证**@paramarray$credentials*@returnbool*/publicfunctionvalidate(array$credentials=[]);/***将\App\User实例设置为当前经过身份验证的用户**@param\Illuminate\Contracts\Auth\Authenticatable$user*@returnvoid*/publicfunctionsetUser(Authenticatable$user);}IlluminateContractsAuthStatefulGuard合约定义了用于在Laravel身份验证系统中对用户进行身份验证的方法。除了对用户进行认证外,还涉及到用户认证成功后如何持久化用户的认证状态。