Laravel用戶認證系統(基礎介紹)

不言
發布: 2023-04-02 16:58:01
原創
3358 人瀏覽過

這篇文章主要介紹了關於Laravel用戶認證系統(基礎介紹) ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

用戶認證系統(基礎介紹)

使用過Laravel的開發者都知道,Laravel自帶了一個認證系統來提供基本的使用者註冊、登入、認證、找回密碼,如果Auth系統裡提供的基礎功能不滿足需求還可以很方便的在這些基礎功能上進行擴充。這篇文章我們先來了解Laravel Auth系統的核心元件。

Auth系統的核心是由 Laravel 的認證組件的「看守器」和「提供器」組成。看守器定義了該如何認證每個請求中使用者。例如,Laravel 自帶的 session 看守器會使用 session 儲存和 cookies 來維護狀態。

下表列出了Laravel Auth系統的核心元件

#Auth#AuthManagerGuard
#作用
AuthManager的Facade
Auth認證系統面向外部的接口,認證系統透過它向應用程式提供所有Auth使用者認證相關的方法,而認證方法的具體實作細節由它代理的特定看守器(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具體的路由方法都定義在Illuminate \Routing\Routerauth方法中,關於如何找到Facade類別代理的實際類別可以翻看先前Facade源碼分析的章節。

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 [

    /*
    |--------------------------------------------------------------------------
    | 认证的默认配置
    |--------------------------------------------------------------------------
    |
    | 设置了认证用的默认"看守器"和密码重置的选项
    |
    */

    &#39;defaults&#39; => [
        &#39;guard&#39; => &#39;web&#39;,
        &#39;passwords&#39; => &#39;users&#39;,
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | 定义项目使用的认证看守器,默认的看守器使用session驱动和Eloquent User 用户数据提供者
    |
    | 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
    |
    | Supported: "session", "token"
    |
    */

    &#39;guards&#39; => [
        &#39;web&#39; => [
            &#39;driver&#39; => &#39;session&#39;,
            &#39;provider&#39; => &#39;users&#39;,
        ],

        &#39;api&#39; => [
            &#39;driver&#39; => &#39;token&#39;,
            &#39;provider&#39; => &#39;users&#39;,
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | 所有的驱动都有一个用户提供者,它定义了如何从数据库或者应用使用的持久化用户数据的存储中取出用户信息
    |
    | Laravel支持通过不同的Guard来认证用户,这里可以定义Guard的用户数据提供者的细节:
    |        使用什么driver以及对应的Model或者table是什么
    |
    | Supported: "database", "eloquent"
    |
    */

    &#39;providers&#39; => [
        &#39;users&#39; => [
            &#39;driver&#39; => &#39;eloquent&#39;,
            &#39;model&#39; => App\Models\User::class,
        ],

        // &#39;users&#39; => [
        //     &#39;driver&#39; => &#39;database&#39;,
        //     &#39;table&#39; => &#39;users&#39;,
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 重置密码相关的配置
    |--------------------------------------------------------------------------
    |
    */

    &#39;passwords&#39; => [
        &#39;users&#39; => [
            &#39;provider&#39; => &#39;users&#39;,
            &#39;table&#39; => &#39;password_resets&#39;,
            &#39;expire&#39; => 60,
        ],
    ],

];
登入後複製

Auth系統的核心是由 Laravel 的認證元件的「看守器」和「提供器」組成。看守器定義了該如何認證每個請求中使用者。例如,Laravel 自帶的 session 看守器會使用 session 儲存和 cookies 來維護狀態。

提供者中定義了該如何從持久化的儲存資料中檢索使用者。 Laravel 自帶支援使用 Eloquent 和資料庫查詢建構器來檢索使用者。當然,你可以根據需要自訂其他提供者。

所以上面的設定檔的意思是Laravel認證系統預設使用了web guard設定項, 配置項裡使用的是看守器是SessionGuard,使用的使用者提供器是EloquentProvider 提供器使用的model是App\User

Guard

看守器定義了該如何認證每個請求中使用者。 Laravel自帶的認證系統預設使用自帶的SessionGuardSessionGuard除了實作\Illuminate\Contracts\Auth契約裡的方法也實作Illuminate##Illuminate \Contracts\Auth\StatefulGuardIlluminate\Contracts\Auth\SupportsBasicAuth契約裡的方法,這些Guard Contracts裡定義的方法都是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

#這個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();
}
登入後複製

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 = &#39;email&#39;, $extraConditions = []);

    /**
     * 进行无状态的Http Basic Auth认证 (认证后不会设置session和cookies)
     *
     * @param  string  $field
     * @param  array  $extraConditions
     * @return \Symfony\Component\HttpFoundation\Response|null
     */
    public function onceBasic($field = &#39;email&#39;, $extraConditions = []);
}
登入後複製

User Provider

#使用者提供者定義了該如何從持久化的儲存資料中檢索用戶,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自帶的使用者認證功能的實作細節。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

Laravel用戶認證系統的實作細節

Laravel微信小程式取得使用者詳細資訊及帶參數小程式碼擴充的分析

#

以上是Laravel用戶認證系統(基礎介紹)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!