最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel認(rèn)證原理以及完全自定義認(rèn)證詳解

 更新時間:2018年07月09日 10:16:06   作者:迷途小碼農(nóng)  
最近在學(xué)習(xí)laravel框架,所以下面這篇文章主要給大家介紹了關(guān)于Laravel認(rèn)證原理以及完全自定義認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

Laravel 默認(rèn)的 auth 功能已經(jīng)是很全面了,但是我們也經(jīng)常會碰到一些需要自定義的一些情況,比如驗證的字段和默認(rèn)的不匹配,比如需要能夠同時滿足 user name 和 email 認(rèn)證等等。如何創(chuàng)建一個完全自定義的認(rèn)證呢?相比一個教程,我更傾向于介紹一下工作原理,這樣在自己修改或自定義的過程中更得心應(yīng)手。

Authenticatable 接口

Illuminate\Contracts\Auth\Authenticatable

Authenticatable 定義了一個可以被用來認(rèn)證的模型或類需要實現(xiàn)的接口,也就是說,如果需要用一個自定義的類來做認(rèn)證,需要實現(xiàn)這個接口定義的方法。

// 獲取唯一標(biāo)識的,可以用來認(rèn)證的字段名,比如 id,uuid
public function getAuthIdentifierName();
// 獲取該標(biāo)示符對應(yīng)的值
public function getAuthIdentifier();
// 獲取認(rèn)證的密碼
public function getAuthPassword();
// 獲取remember token
public function getRememberToken();
// 設(shè)置 remember token
public function setRememberToken($value);
// 獲取 remember token 對應(yīng)的字段名,比如默認(rèn)的 'remember_token'
public function getRememberTokenName();

比如你的認(rèn)證模型需要用 'token' 而不是 'password' 來作為密碼驗證,這個時候就可以修改 getAuthPassword() 方法的返回值為 'token';

Authenticatable trait

Illuminate\Auth\Authenticatable

Laravel 中定義的 Authenticatable trait,也是 Laravel auth 默認(rèn)的 User 模型使用的 trait,這個 trait 定義了 User 模型默認(rèn)認(rèn)證標(biāo)示符為 'id',密碼字段為 'password',remember token 對應(yīng)的字段為 remember_token 等等。

通過重寫 User 模型的這些方法可以修改一些設(shè)置。

Guard 接口

Illuminate\Contracts\Auth\Guard

Guard 接口定義了某個實現(xiàn)了 Authenticatable (可認(rèn)證的) 模型或類的認(rèn)證方法以及一些常用的接口。

// 判斷當(dāng)前用戶是否登錄
public function check();
// 判斷當(dāng)前用戶是否是游客(未登錄)
public function guest();
// 獲取當(dāng)前認(rèn)證的用戶
public function user();
// 獲取當(dāng)前認(rèn)證用戶的 id,嚴(yán)格來說不一定是 id,應(yīng)該是上個模型中定義的唯一的字段名
public function id();
// 根據(jù)提供的消息認(rèn)證用戶
public function validate(array $credentials = []);
// 設(shè)置當(dāng)前用戶
public function setUser(Authenticatable $user);

StatefulGuard 接口

Illuminate\Contracts\Auth\StatefulGuard

StatefulGuard 接口繼承自 Guard 接口,除了 Guard 里面定義的一些基本接口外,還增加了更進(jìn)一步、有狀態(tài)的 Guard.

新添加的接口有這些:

// 嘗試根據(jù)提供的憑證驗證用戶是否合法
public function attempt(array $credentials = [], $remember = false);
// 一次性登錄,不記錄session or cookie
public function once(array $credentials = []);
// 登錄用戶,通常在驗證成功后記錄 session 和 cookie 
public function login(Authenticatable $user, $remember = false);
// 使用用戶 id 登錄
public function loginUsingId($id, $remember = false);
// 使用用戶 ID 登錄,但是不記錄 session 和 cookie
public function onceUsingId($id);
// 通過 cookie 中的 remember token 自動登錄
public function viaRemember();
// 登出
public function logout();

Laravel 中默認(rèn)提供了 3 中 guard:RequestGuard,TokenGuard,SessionGuard.

RequestGuard

Illuminate\Auth\RequestGuard

RequestGuard 是一個非常簡單的 guard. RequestGuard 是通過傳入一個閉包來認(rèn)證的??梢酝ㄟ^調(diào)用 Auth::viaRequest 添加一個自定義的 RequestGuard.

SessionGuard

Illuminate\Auth\SessionGuard

SessionGuard 是 Laravel web 認(rèn)證默認(rèn)的 guard.

TokenGuard

Illuminate\Auth\TokenGuard

TokenGuard 適用于無狀態(tài) api 認(rèn)證,通過 token 認(rèn)證.

UserProvider 接口

Illuminate\Contracts\Auth\UserProvider

UserProvider 接口定義了獲取認(rèn)證模型的方法,比如根據(jù) id 獲取模型,根據(jù) email 獲取模型等等.

// 通過唯一標(biāo)示符獲取認(rèn)證模型
public function retrieveById($identifier);
// 通過唯一標(biāo)示符和 remember token 獲取模型
public function retrieveByToken($identifier, $token);
// 通過給定的認(rèn)證模型更新 remember token
public function updateRememberToken(Authenticatable $user, $token);
// 通過給定的憑證獲取用戶,比如 email 或用戶名等等
public function retrieveByCredentials(array $credentials);
// 認(rèn)證給定的用戶和給定的憑證是否符合
public function validateCredentials(Authenticatable $user, array $credentials);

Laravel 中默認(rèn)有兩個 user provider: DatabaseUserProvider & EloquentUserProvider.

DatabaseUserProvider

Illuminate\Auth\DatabaseUserProvider

直接通過數(shù)據(jù)庫表來獲取認(rèn)證模型.

EloquentUserProvider

Illuminate\Auth\EloquentUserProvider

通過 eloquent 模型來獲取認(rèn)證模型

AuthManager

Illuminate\Auth\AuthManager

Guard 用來認(rèn)證一個用戶是否認(rèn)證成功, UserProvider 用來提供認(rèn)證模型的來源,而根據(jù)項目的 config 管理 guard 以及自定義 guard 等等功能,則是通過 AuthManager 來實現(xiàn)。

AuthManager 應(yīng)該是有點像策略模式里面的 Context 類以及工廠方法里面的工廠,一方面管理 Guard,另外一方面通過 __call 魔術(shù)方法調(diào)用具體的策略(Guard)方法。

Auth facade 對應(yīng)的實現(xiàn)類就是 AuthManager,AuthManager 在容器中注冊為單例,用來管理所有的 guard、user provider 以及 guard 的代理工作。

自定義認(rèn)證

根據(jù)上面的知識,可以知道要自定義一個認(rèn)證很簡單。

  • 創(chuàng)建認(rèn)證模型

創(chuàng)建一個自定義的認(rèn)證模型,實現(xiàn) Authenticatable 接口;

  • 創(chuàng)建自定義的 UserProvider

創(chuàng)建一個自定義的 UserProvider,實現(xiàn) UserProvider 接口,可以返回上面自定義的認(rèn)證模型;

  • 創(chuàng)建自定義的 Guard

創(chuàng)建一個自定義的 Guard,實現(xiàn) Guard或StatefulGuard 接口

  • 添加 guard creator 和 user provider creator 到 AuthManager 中

在 AppServiceProvider 的 boot 方法添加如下代碼:

Auth::extend('myguard', function(){
 ...
 return new MyGuard(); //返回自定義 guard 實例
 ...
});

Auth::provider('myuserprovider', function(){
 return new MyUserProvider(); // 返回自定義的 user provider
});

在 config\auth.php的 guards 數(shù)組中添加自定義 guard,一個自定義 guard 包括兩部分: driver 和 provider.

'oustn' => [
 'driver' => 'myguard',
 'provider' => 'myusers',
],

在 config\auth.php的 providers 數(shù)組中添加自定義 user provider.

'myusers' => [
 'driver' => 'myuserprovider' // 里面具體的字段可以根據(jù)你創(chuàng)建 user provider 需要的信息自由添加,可以通過 Auth::createUserProvider('myuserprovider') 創(chuàng)建
],

設(shè)置 config\auth.php 的 defaults.guard 為 oustn.

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • PHP 9 大緩存技術(shù)總結(jié)

    PHP 9 大緩存技術(shù)總結(jié)

    也就是將頁面全部生成html靜態(tài)頁面,用戶訪問時直接訪問的靜態(tài)頁面,而不會去走php服務(wù)器解析的流程。此種方式,在CMS系統(tǒng)中比較常見,比如dedecms,下面通過本文給大家分享了php9大緩存技術(shù)總結(jié),需要的朋友可以參考下
    2015-09-09
  • PHP 7.4 新語法之箭頭函數(shù)實例詳解

    PHP 7.4 新語法之箭頭函數(shù)實例詳解

    短閉包,也叫做箭頭函數(shù),是一種用 php 編寫的短函數(shù).這篇文章主要介紹了PHP 7.4 新語法之箭頭函數(shù),需要的朋友可以參考下
    2019-05-05
  • Windows下配置Nginx和PHP的步驟及測試

    Windows下配置Nginx和PHP的步驟及測試

    這篇文章主要給大家介紹了關(guān)于Windows下配置Nginx和PHP的步驟及測試,文中包括了在Windows環(huán)境下配置Nginx和PHP的步驟,包括下載、解壓、配置和測試,通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • Yii多表聯(lián)合查詢操作詳解

    Yii多表聯(lián)合查詢操作詳解

    這篇文章主要為大家詳細(xì)介紹了Yii多表聯(lián)查操作,對Yii多表聯(lián)合查詢操作進(jìn)行了總結(jié),感興趣的小伙伴們可以參考一下
    2016-06-06
  • php命令行模式代碼實例詳解

    php命令行模式代碼實例詳解

    這篇文章主要介紹了關(guān)于php命令行模式代碼實例詳解,有感興趣的同學(xué)可以借鑒參考下
    2021-02-02
  • DEDECMS首頁調(diào)用圖片集里的多張圖片

    DEDECMS首頁調(diào)用圖片集里的多張圖片

    本文給大家分享的是織夢系統(tǒng)中首頁調(diào)用圖片集里的多張圖片的方法,有相同需要的小伙伴可以參考下。
    2015-06-06
  • ThinkPHP令牌驗證實例

    ThinkPHP令牌驗證實例

    ThinkPHP新版內(nèi)置了表單令牌驗證功能,可以有效防止表單的遠(yuǎn)程提交等安全防護(hù)。這篇文章主要介紹了ThinkPHP令牌驗證,需要的朋友可以參考下
    2014-06-06
  • 深入淺析PHP7.0新特征(五大新特征)

    深入淺析PHP7.0新特征(五大新特征)

    PHP7將在2015年10月正式發(fā)布,PHP7 ,將會是PHP腳本語言的重大版本更新,同時將帶來大幅的性能改進(jìn)和新的特性,以及改進(jìn)一些過時功能。該發(fā)布版本將會專注在性能加強,源自PHP版本樹中的phpng分支
    2015-10-10
  • 如何在centos8自定義目錄安裝php7.3

    如何在centos8自定義目錄安裝php7.3

    在本文中我們將給大家介紹如何在centos8自定義目錄安裝php7.3,在選擇要安裝的PHP版本之前,請確保你的應(yīng)用程序支持它,我們還將向你展示如何將PHP與Nginx和Apache集成,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • destoon實現(xiàn)底部添加你是第幾位訪問者的方法

    destoon實現(xiàn)底部添加你是第幾位訪問者的方法

    這篇文章主要介紹了destoon實現(xiàn)底部添加你是第幾位訪問者的方法,需要的朋友可以參考下
    2014-07-07

最新評論

江阴市| 永春县| 元谋县| 都江堰市| 南阳市| 乌兰县| 德惠市| 福建省| 东乡| 泗水县| 剑阁县| 确山县| 葵青区| 大宁县| 格尔木市| 黔江区| 抚州市| 卢氏县| 房产| 永善县| 通海县| 凯里市| 灌阳县| 绥宁县| 东平县| 丘北县| 敦化市| 中西区| 盱眙县| 灵丘县| 禄丰县| 鸡泽县| 康平县| 郎溪县| 永靖县| 横峰县| 万宁市| 金昌市| 东丽区| 镇江市| 土默特右旗|