您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Laravel認證中原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Authenticatable 接口
Illuminate\Contracts\Auth\Authenticatable
Authenticatable 定義了一個可以被用來認證的模型或類需要實現的接口,也就是說,如果需要用一個自定義的類來做認證,需要實現這個接口定義的方法。
// 獲取唯一標識的,可以用來認證的字段名,比如 id,uuid public function getAuthIdentifierName(); // 獲取該標示符對應的值 public function getAuthIdentifier(); // 獲取認證的密碼 public function getAuthPassword(); // 獲取remember token public function getRememberToken(); // 設置 remember token public 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 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 中默認提供了 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 token public 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.
以上就是Laravel認證中原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。