资讯专栏INFORMATION COLUMN

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

RebeccaZhong / 3167人阅读

摘要:系统的核心是由的认证组件的看守器和提供器组成。使用的认证系统,几乎所有东西都已经为你配置好了。其配置文件位于,其中包含了用于调整认证服务行为的注释清晰的选项配置。

用户认证系统(基础介绍)

使用过Laravel的开发者都知道,Laravel自带了一个认证系统来提供基本的用户注册、登录、认证、找回密码,如果Auth系统里提供的基础功能不满足需求还可以很方便的在这些基础功能上进行扩展。这篇文章我们先来了解一下Laravel Auth系统的核心组件。

Auth系统的核心是由 Laravel 的认证组件的「看守器」和「提供器」组成。看守器定义了该如何认证每个请求中用户。例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。

下表列出了Laravel Auth系统的核心部件

名称 作用
Auth AuthManager的Facade
AuthManager Auth认证系统面向外部的接口,认证系统通过它向应用提供所有Auth用户认证相关的方法,而认证方法的具体实现细节由它代理的具体看守器(Guard)来完成。
Guard 看守器,定义了该如何认证每个请求中用户
User Provider 用户提供器,定义了如何从持久化的存储数据中检索用户

在本文中我们会详细介绍这些核心部件,然后在文章的最后更新每个部件的作用细节到上面给出的这个表中。

开始使用Auth系统

只需在新的 Laravel 应用上运行 php artisan make:auth 和 php artisan migrate 命令就能够在项目里生成Auth系统需要的路由和视图以及数据表。

php artisan make:auth执行后会生成Auth认证系统需要的视图文件,此外还会在路由文件web.php中增加响应的路由:

Auth::routes();

Auth Facade文件中多带带定义了routes这个静态方法

public static function routes()
{
    static::$app->make("router")->auth();
}

所以Auth具体的路由方法都定义在IlluminateRoutingRouterauth方法中,关于如何找到Facade类代理的实际类可以翻看之前Facade源码分析的章节。

namespace IlluminateRouting;
class Router implements RegistrarContract, BindingRegistrar
{
    /**
     * Register the typical authentication routes for an application.
     *
     * @return void
     */
    public function auth()
    {
        // Authentication Routes...
        $this->get("login", "AuthLoginController@showLoginForm")->name("login");
        $this->post("login", "AuthLoginController@login");
        $this->post("logout", "AuthLoginController@logout")->name("logout");

        // Registration Routes...
        $this->get("register", "AuthRegisterController@showRegistrationForm")->name("register");
        $this->post("register", "AuthRegisterController@register");

        // Password Reset Routes...
        $this->get("password/reset", "AuthForgotPasswordController@showLinkRequestForm")->name("password.request");
        $this->post("password/email", "AuthForgotPasswordController@sendResetLinkEmail")->name("password.email");
        $this->get("password/reset/{token}", "AuthResetPasswordController@showResetForm")->name("password.reset");
        $this->post("password/reset", "AuthResetPasswordController@reset");
    }
}

auth方法里可以清晰的看到认证系统里提供的所有功能的路由URI以及对应的控制器和方法。

使用Laravel的认证系统,几乎所有东西都已经为你配置好了。其配置文件位于 config/auth.php,其中包含了用于调整认证服务行为的注释清晰的选项配置。

 [
        "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" => AppModelsUser::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是AppUser

Guard

看守器定义了该如何认证每个请求中用户。Laravel自带的认证系统默认使用自带的 SessionGuardSessionGuard除了实现IlluminateContractsAuth契约里的方法还实现IlluminateContractsAuthStatefulGuardIlluminateContractsAuthSupportsBasicAuth契约里的方法,这些Guard Contracts里定义的方法都是Laravel Auth系统默认认证方式依赖的基础方法。

我们先来看一下这一些基础方法都意欲完成什么操作,等到分析Laravel是如何通过SessionGuard认证用户时在去关系这些方法的具体实现。

IlluminateContractsAuthGuard

这个文件定义了基础的认证方法

namespace IlluminateContractsAuth;

interface Guard
{
    /**
     * 返回当前用户是否时已通过认证,是返回true,否者返回false
     *
     * @return bool
     */
    public function check();

    /**
     * 验证是否时访客用户(非登录认证通过的用户)
     *
     * @return bool
     */
    public function guest();

    /**
     * 获取当前用户的用户信息数据,获取成功返回用户User模型实例(AppUser实现了Authenticatable接口)
     * 失败返回null
     * @return IlluminateContractsAuthAuthenticatable|null
     */
    public function user();

    /**
     * 获取当前认证用户的用户ID,成功返回ID值,失败返回null
     *
     * @return int|null
     */
    public function id();

    /**
     * 通过credentials(一般是邮箱和密码)验证用户
     *
     * @param  array  $credentials
     * @return bool
     */
    public function validate(array $credentials = []);

    /**
     * 将一个AppUser实例设置成当前的认证用户
     *
     * @param  IlluminateContractsAuthAuthenticatable  $user
     * @return void
     */
    public function setUser(Authenticatable $user);
}
IlluminateContractsAuthStatefulGuard

这个Contracts定义了Laravel auth系统里认证用户时使用的方法,除了认证用户外还会涉及用户认证成功后如何持久化用户的认证状态。


IlluminateContractsAuthSupportsBasicAuth

定义了通过Http Basic Auth 认证用户的方法

namespace IlluminateContractsAuth;

interface SupportsBasicAuth
{
    /**
     * 尝试通过HTTP Basic Auth来认证用户
     *
     * @param  string  $field
     * @param  array  $extraConditions
     * @return SymfonyComponentHttpFoundationResponse|null
     */
    public function basic($field = "email", $extraConditions = []);

    /**
     * 进行无状态的Http Basic Auth认证 (认证后不会设置session和cookies)
     *
     * @param  string  $field
     * @param  array  $extraConditions
     * @return SymfonyComponentHttpFoundationResponse|null
     */
    public function onceBasic($field = "email", $extraConditions = []);
}
User Provider

用户提供器中定义了该如何从持久化的存储数据中检索用户,Laravel定义了用户提供器契约(interface),所有用户提供器都要实现这个接口里定义的抽象方法,因为实现了统一的接口所以使得无论是Laravel 自带的还是自定义的用户提供器都能够被Guard使用。

用户提供器契约

如下是契约中定义的必需被用户提供器实现的抽象方法:


通过配置文件config/auth.php可以看到Laravel默认使用的用户提供器是IlluminateAuthEloquentUserProvider , 下一章节我们分析Laravel Auth系统实现细节的时候我们再来看看EloquentUserProvider是怎么实现用户提供器契约中的抽象方法的。

总结

本节我们主要介绍Laravel Auth系统的基础,包括Auth系统的核心组件看守器和提供器,AuthManager通过调用配置文件里指定的看守器来完成用户认证,在认证过程需要的用户数据是看守器通过用户提供器获取到的,下面的表格里总结了Auth系统的核心部件以及每个部件的作用。

名称 作用
Auth AuthManager的Facade
AuthManager Auth认证系统面向外部的接口,认证系统通过它向应用提供所有Auth用户认证相关的方法,而认证方法的具体实现细节由它代理的具体看守器(Guard)来完成。
Guard 看守器,定义了该如何认证每个请求中用户,认证时需要的用户数据会通过用户数据提供器来获取。
User Provider 用户提供器,定义了如何从持久化的存储数据中检索用户,Guard认证用户时会通过提供器取用户的数据,所有的提供器都是IlluminateContractsAuthUserProvider接口的实现,提供了从持久化存储中取用户数据的具体实现细节。

下一章节我们会看看Laravel自带的用户认证功能的实现细节。

本文已经收录在系列文章Laravel源码学习里,欢迎访问阅读。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28910.html

相关文章

  • Laravel核心解读 -- 扩展用户认证系统

    摘要:扩展用户认证系统上一节我们介绍了系统实现的一些细节知道了是如何应用看守器和用户提供器来进行用户认证的,但是针对我们自己开发的项目或多或少地我们都会需要在自带的看守器和用户提供器基础之上做一些定制化来适应项目,本节我会列举一个在做项目时遇到的 扩展用户认证系统 上一节我们介绍了Laravel Auth系统实现的一些细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是...

    王伟廷 评论0 收藏0
  • Laravel核心解读--完结篇

    摘要:过去一年时间写了多篇文章来探讨了我认为的框架最核心部分的设计思路代码实现。为了大家阅读方便,我把这些源码学习的文章汇总到这里。数据库算法和数据结构这些都是编程的内功,只有内功深厚了才能解决遇到的复杂问题。 过去一年时间写了20多篇文章来探讨了我认为的Larave框架最核心部分的设计思路、代码实现。通过更新文章自己在软件设计、文字表达方面都有所提高,在刚开始决定写Laravel源码分析地...

    laoLiueizo 评论0 收藏0
  • Laravel核心解读--用户认证系统的实现细节

    摘要:通过装载看守器和用户提供器装载看守器和用户提供器用到的方法比较多,用文字描述不太清楚,我们通过注解这个过程中用到的方法来看具体的实现细节。 用户认证系统的实现细节 上一节我们介绍来Laravel Auth系统的基础知识,说了他的核心组件都有哪些构成,这一节我们会专注Laravel Auth系统的实现细节,主要关注Auth也就是AuthManager是如何装载认证用的看守器(Guard)...

    NicolasHe 评论0 收藏0
  • Laravel核心解读--Contracts契约

    摘要:的契约是一组定义框架提供的核心服务的接口,例如我们在介绍用户认证的章节中到的用户看守器契约和用户提供器契约以及框架自带的模型所实现的契约。接口与团队开发当你的团队在开发大型应用时,不同的部分有着不同的开发速度。 Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuth...

    Prasanta 评论0 收藏0
  • Lumen用户认证JWT,源码解读

    摘要:如何做用户认证根据文档描述,提供用户认证的接口,他的核心是看守器和提供器,看守器定义怎么认证用户,提供器定义怎么检索用户。 最近的一个PHP项目,上一个项目是采用ThinkPHP来弄的,因为很早就听说过Laravel的大名,所以进了Laravel的官网,意外发现了Lumen,正好我项目是提供API的,所以选择了Lumen,因为是Laravel的精简版,看了几天的Laravel文档,也总...

    AZmake 评论0 收藏0

发表评论

0条评论

RebeccaZhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<