亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Laravel認證原理以及完全自定義認證詳解

2024-05-05 00:04:32
字體:
來源:轉載
供稿:網友

前言

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

Authenticatable 接口

Illuminate/Contracts/Auth/Authenticatable

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

// 獲取唯一標識的,可以用來認證的字段名,比如 id,uuidpublic function getAuthIdentifierName();// 獲取該標示符對應的值public function getAuthIdentifier();// 獲取認證的密碼public function getAuthPassword();// 獲取remember tokenpublic function getRememberToken();// 設置 remember tokenpublic function setRememberToken($value);// 獲取 remember token 對應的字段名,比如默認的 'remember_token'public function getRememberTokenName();

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

Authenticatable trait

Illuminate/Auth/Authenticatable

Laravel 中定義的 Authenticatable trait,也是 Laravel auth 默認的 User 模型使用的 trait,這個 trait 定義了 User 模型默認認證標示符為 'id',密碼字段為 'password',remember token 對應的字段為 remember_token 等等。

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

Guard 接口

Illuminate/Contracts/Auth/Guard

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

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

StatefulGuard 接口

Illuminate/Contracts/Auth/StatefulGuard

StatefulGuard 接口繼承自 Guard 接口,除了 Guard 里面定義的一些基本接口外,還增加了更進一步、有狀態的 Guard.

新添加的接口有這些:

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

Laravel 中默認提供了 3 中 guard:RequestGuard,TokenGuard,SessionGuard.

RequestGuard

Illuminate/Auth/RequestGuard

RequestGuard 是一個非常簡單的 guard. RequestGuard 是通過傳入一個閉包來認證的。可以通過調用 Auth::viaRequest 添加一個自定義的 RequestGuard.

SessionGuard

Illuminate/Auth/SessionGuard

SessionGuard 是 Laravel web 認證默認的 guard.

TokenGuard

Illuminate/Auth/TokenGuard

TokenGuard 適用于無狀態 api 認證,通過 token 認證.

UserProvider 接口

Illuminate/Contracts/Auth/UserProvider

UserProvider 接口定義了獲取認證模型的方法,比如根據 id 獲取模型,根據 email 獲取模型等等.

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

Laravel 中默認有兩個 user provider: DatabaseUserProvider & EloquentUserProvider.

DatabaseUserProvider

Illuminate/Auth/DatabaseUserProvider

直接通過數據庫表來獲取認證模型.

EloquentUserProvider

Illuminate/Auth/EloquentUserProvider

通過 eloquent 模型來獲取認證模型

AuthManager

Illuminate/Auth/AuthManager

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

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

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

自定義認證

根據上面的知識,可以知道要自定義一個認證很簡單。

  • 創建認證模型

創建一個自定義的認證模型,實現 Authenticatable 接口;

  • 創建自定義的 UserProvider

創建一個自定義的 UserProvider,實現 UserProvider 接口,可以返回上面自定義的認證模型;

  • 創建自定義的 Guard

創建一個自定義的 Guard,實現 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 數組中添加自定義 guard,一個自定義 guard 包括兩部分: driver 和 provider.

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

在 config/auth.php的 providers 數組中添加自定義 user provider.

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

設置 config/auth.php 的 defaults.guard 為 oustn.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久精品国产91性色| 亚洲国产天堂久久国产91| 国产精品视频一区二区高潮| 色爱av美腿丝袜综合粉嫩av| 97精品视频在线| 亚洲欧美成人在线| 亚洲a成v人在线观看| 中文字幕国产亚洲2019| 精品久久久久久中文字幕大豆网| 亚洲国产成人精品女人久久久| 国内精品久久久久影院 日本资源| 精品人伦一区二区三区蜜桃免费| 欧美重口另类videos人妖| 欧美一区深夜视频| 中文字幕欧美在线| 日韩欧美在线视频免费观看| 欧美xxxx18性欧美| 69av成年福利视频| 久久偷看各类女兵18女厕嘘嘘| 欧美精品在线视频观看| 亚洲欧美中文另类| 热99在线视频| 性金发美女69hd大尺寸| 亚洲乱码av中文一区二区| 亚洲激情 国产| 日韩成人激情视频| 国产精选久久久久久| 亚洲精品久久7777777| 91亚洲精品一区二区| 亚洲黄色www网站| 欧美激情免费视频| 国产不卡视频在线| 久久久精品亚洲| 国产高清视频一区三区| 欧美重口另类videos人妖| 亚洲日本中文字幕| 欧美性猛交xxxx富婆弯腰| 国产精品xxx视频| 欧美高清理论片| 欧美国产日韩视频| 欧美日韩中文字幕日韩欧美| 亚洲一二在线观看| 欧美激情乱人伦一区| 亚洲色图第三页| 欧美成人自拍视频| 成人免费网站在线| 久久精品国产69国产精品亚洲| 97在线日本国产| 97国产在线观看| 亚洲日韩欧美视频一区| 亚洲最大福利视频| 久久久久国产精品免费| 国产欧美婷婷中文| 欧美国产一区二区三区| 国产成人精品优优av| 97视频免费看| 国产精品女人久久久久久| 欧美日韩国产成人在线| 爱福利视频一区| 亚洲香蕉在线观看| 国产亚洲a∨片在线观看| 国产在线观看91精品一区| 欧美日韩精品二区| 中文字幕亚洲激情| 欧美性xxxx在线播放| 国产一区香蕉久久| 日韩在线免费观看视频| 亚洲第一黄色网| 欧美情侣性视频| 日韩欧美在线第一页| 国产亚洲a∨片在线观看| 国产亚洲精品久久| 亚洲国产日韩精品在线| 亚洲精品成人免费| 久久精品99无色码中文字幕| 另类美女黄大片| 国产精品高潮粉嫩av| 美女av一区二区| 黄色一区二区在线观看| 日韩女优人人人人射在线视频| 自拍亚洲一区欧美另类| 国产精品日韩欧美综合| 色综合天天狠天天透天天伊人| 国内精久久久久久久久久人| 岛国视频午夜一区免费在线观看| 91色视频在线观看| 91成人国产在线观看| 欧美黑人性生活视频| 中文字幕欧美精品日韩中文字幕| 亚洲国产精品电影| 久久99青青精品免费观看| 欧美性猛交xxxx富婆| 久久久999精品| 国产精品欧美一区二区三区奶水| 国产精品久久久久久久久久三级| 国产成人精品免费久久久久| 欧美午夜性色大片在线观看| 成人啪啪免费看| 美日韩精品免费视频| 性欧美激情精品| 成人在线激情视频| 91精品视频免费看| 日韩视频第一页| 深夜成人在线观看| 91精品一区二区| 国产香蕉精品视频一区二区三区| 色妞久久福利网| 欧美专区在线视频| 欧美一级bbbbb性bbbb喷潮片| 91九色国产社区在线观看| 欧美成人午夜剧场免费观看| 亚洲女在线观看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲精选中文字幕| 日韩在线视频免费观看高清中文| 亚洲图片在区色| 国产精品久久久久久久9999| 欧美人交a欧美精品| 欧美理论电影网| …久久精品99久久香蕉国产| 久久香蕉频线观| 欧美大片免费看| 午夜精品久久久久久久久久久久| 91免费福利视频| 97香蕉超级碰碰久久免费软件| 亚洲国产精品久久91精品| 日韩av在线免费播放| 欧美一区二区三区图| 成人免费福利在线| 日韩视频免费大全中文字幕| 日韩av高清不卡| 国产在线观看91精品一区| 最近日韩中文字幕中文| 国产一区二区日韩精品欧美精品| 一本一道久久a久久精品逆3p| 国模精品视频一区二区| 伦伦影院午夜日韩欧美限制| 精品国产一区二区三区久久狼黑人| 国产精品视频在线播放| 正在播放欧美一区| 中文字幕日韩综合av| 亚洲新中文字幕| 欧美乱妇40p| 久久精品国产亚洲精品2020| 欧美激情影音先锋| 亚洲自拍偷拍色片视频| 中文字幕欧美日韩va免费视频| 日韩电影免费在线观看中文字幕| 欧美黑人一区二区三区| 日韩精品极品在线观看| 91情侣偷在线精品国产| 精品动漫一区二区| 欧美日本国产在线| 色噜噜亚洲精品中文字幕| 日韩二区三区在线| 欧美体内谢she精2性欧美| 成人福利免费观看| 亚洲欧洲日产国产网站| 日韩av手机在线看| 亚洲国产一区二区三区四区| 国产精品福利小视频| 中文字幕日韩专区| 亚洲欧美中文字幕在线一区| 中文字幕亚洲色图|