首頁  >  文章  >  後端開發  >  php實例之Laravel認證原理以及完全自訂認證詳解

php實例之Laravel認證原理以及完全自訂認證詳解

无忌哥哥
无忌哥哥原創
2018-07-12 14:28:112440瀏覽

最近在學習laravel框架,所以下面這篇文章主要給大家介紹了關於Laravel認證原理以及完全自定義認證的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧

前言

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

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.

以上是php實例之Laravel認證原理以及完全自訂認證詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn