php執行個體之Laravel認證原理以及完全自訂認證詳解

來源:互聯網
上載者:User
最近在學習laravel架構,所以下面這篇文章主要給大家介紹了關於Laravel認證原理以及完全自訂認證的相關資料,文中通過範例程式碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧

前言

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);// 使用使用者識別碼 登入,但是不記錄 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 類以及Factory 方法裡面的工廠,一方面管理 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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.