国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

用戶認(rèn)證

用戶認(rèn)證


用戶認(rèn)證

引言

{tip} 想要快速開(kāi)始嗎? 只要在一個(gè)新的 Laravel 應(yīng)用程序中運(yùn)行 php artisan make:authphp artisan migrate 就可以了。 然后,把你的瀏覽器導(dǎo)航到 http://your-app.test/register 或者其他任意一個(gè)分配給你的程序的 URL。這兩個(gè)命令將負(fù)責(zé)構(gòu)建整個(gè)認(rèn)證系統(tǒng)!

Laravel 使得實(shí)現(xiàn)身份驗(yàn)證非常簡(jiǎn)單。 事實(shí)上,幾乎所有的配置都是現(xiàn)成的。 身份驗(yàn)證配置文件位于 config/auth.php, 其中包含幾個(gè)有良好文檔記錄的選項(xiàng),用于調(diào)整身份驗(yàn)證服務(wù)的行為。

在其核心,Laravel 的認(rèn)證設(shè)施由 “警衛(wèi)” 和 “提供者” 組成。守衛(wèi)決定如何對(duì)每個(gè)請(qǐng)求的用戶進(jìn)行身份驗(yàn)證。比如,Laravel 帶有一個(gè) session 保護(hù),它使用會(huì)話存儲(chǔ)和 Cookies 來(lái)維護(hù)狀態(tài)。

提供者決定如何從持久儲(chǔ)存中檢索用戶。 Laravel 支持使用 Eloquent 和數(shù)據(jù)庫(kù)查詢生成器檢索用戶。但是,你可以根據(jù)應(yīng)用程序的需要來(lái)自由定義其他提供者。

如果這些聽(tīng)起來(lái)讓你很困惑,別擔(dān)心!許多應(yīng)用程序永遠(yuǎn)不需要修改默認(rèn)的身份驗(yàn)證配置。

數(shù)據(jù)庫(kù)注意事項(xiàng)

默認(rèn)情況下, Laravel 包含一個(gè) App\User Eloquent model 在你的 app 目錄下。 這個(gè)模型可與默認(rèn)的 Eloquent 身份驗(yàn)證驅(qū)動(dòng)程序一起使用。如果你的應(yīng)用程序沒(méi)有使用 Eloquent,你可以用 database 身份驗(yàn)證驅(qū)動(dòng)程序,它用的是 Laravel 查詢生成器。

當(dāng)為 App\User 模型生成數(shù)據(jù)庫(kù)架構(gòu)時(shí),確保密碼的長(zhǎng)度至少為 60 個(gè)字符。保持默認(rèn)的字符串長(zhǎng)度為 255 個(gè)字符是一個(gè)不錯(cuò)的選擇。

另外,你應(yīng)該驗(yàn)證 “users”(或等效)表是否包含一個(gè)可空的,含有 100 個(gè)字符的 remember_token 字符串。此列將用于存儲(chǔ)用戶登錄應(yīng)用程序時(shí)選擇 “記住我” 選項(xiàng)的令牌。

用戶認(rèn)證快速指南

Laravel 附帶了幾個(gè)預(yù)構(gòu)建的身份驗(yàn)證控制器,它們位于 App\Http\Controllers\Auth 命名空間中。RegisterController 處理新的用戶注冊(cè),LoginController 處理身份驗(yàn)證,ForgotPasswordController 處理用于重置密碼的電子郵件鏈接,ResetPasswordController 包含重置密碼的邏輯。這些控制器中的每一個(gè)都使用一個(gè)特性來(lái)包含它們的必要方法。對(duì)于許多應(yīng)用程序,您根本不需要修改這些控制器。

路由

Laravel 提供了一種快速的方法,可以使用一個(gè)簡(jiǎn)單的命令來(lái)搭建認(rèn)證所需的所有路由和視圖:

php artisan make:auth

此命令應(yīng)該用于新應(yīng)用程序,并將安裝布局視圖、注冊(cè)和登錄視圖以及所有身份驗(yàn)證端點(diǎn)的路由。還將生成一個(gè) HomeController 來(lái)處理應(yīng)用程序儀表板的登錄后請(qǐng)求。

{tip} 如果應(yīng)用程序不需要注冊(cè),可以通過(guò)刪除新創(chuàng)建的 RegisterController 并修改路由聲明來(lái)禁用它: Auth::routes(['register' => false]);。

視圖

如前一節(jié)所述, php artisan make:auth 命令將創(chuàng)建認(rèn)證所需的所有視圖,并將它們放在 resources/views/auth 目錄中。

make:auth 命令還將創(chuàng)建一個(gè)包含應(yīng)用程序基本布局的 resources/views/layouts 目錄。所有這些視圖都使用了 Bootstrap CSS 框架,但是你可以自由地定制它們。

認(rèn)證

現(xiàn)在已經(jīng)給認(rèn)證的控制器設(shè)置好了路由和視圖,你可以在應(yīng)用中注冊(cè)和認(rèn)證新用戶了!因?yàn)榭刂破饕呀?jīng)默認(rèn)包含了驗(yàn)證用戶是否存在和保存用戶到數(shù)據(jù)庫(kù)中的認(rèn)證邏輯(通過(guò) traits 實(shí)現(xiàn)的),現(xiàn)在你已經(jīng)可以在瀏覽器中訪問(wèn)應(yīng)用了。

自定義路徑

當(dāng)用戶認(rèn)證成功,他們會(huì)被重定向到 /home 這個(gè) URI 下。你可以在 LoginController,RegisterController, ResetPasswordController,還有 VerificationController 控制器中定義 redirectTo 屬性來(lái)自定義驗(yàn)證后的重定向位置:

protected $redirectTo = '/';

接下,你應(yīng)該修改 RedirectIfAuthenticated 中間件中的 handle 方法,以便在重定向用戶時(shí)重定向到新的 URI。

如果重定向路徑需要自定義生成邏輯,你可以定義 redirectTo 方法替代 redirectTo 屬性:

protected function redirectTo(){ 
   return '/path';
 }

{提示}  redirectTo 方法優(yōu)先于 redirectTo 屬性。

自定義用戶名

Laravel 默認(rèn)使用 email 字段來(lái)認(rèn)證。如果你想使用其他的字段,可以在 LoginController 控制器里面定義一個(gè) username 方法:

public function username(){  
  return 'username';
 }

自定義看守器

你還可以自定義用戶認(rèn)證和注冊(cè)的 「看守器」。要實(shí)現(xiàn)這一功能,需要在 LoginController,RegisterControllerResetPasswordController 中定義 guard 方法。該方法會(huì)返回一個(gè)看守器實(shí)例:

use Illuminate\Support\Facades\Auth;protected function guard(){ 
   return Auth::guard('guard-name');
 }

自定義驗(yàn)證 / 存儲(chǔ)

為了修改新用戶在注冊(cè)時(shí)所需要填寫(xiě)的表單字段,或者自定義如何將新用戶存儲(chǔ)到數(shù)據(jù)庫(kù)中,你可以修改  RegisterController 類(lèi)。該類(lèi)負(fù)責(zé)驗(yàn)證和創(chuàng)建新用戶。

RegisterController 類(lèi)的 validator 方法包含了驗(yàn)證新用戶的規(guī)則,你可以隨心所欲地自定義該方法。

RegisterControllercreate 方法負(fù)責(zé)使用  Eloquent ORM 在數(shù)據(jù)庫(kù)中創(chuàng)建新的 App\User 記錄。你可以根據(jù)數(shù)據(jù)庫(kù)的需要自定義該方法。

檢索認(rèn)證用戶

你可以通過(guò) Auth facade 來(lái)訪問(wèn)已認(rèn)證的用戶:

use Illuminate\Support\Facades\Auth;
// 獲取當(dāng)前通過(guò)認(rèn)證的用戶...
$user = Auth::user();
// 獲取當(dāng)前通過(guò)認(rèn)證的用戶 ID...
$id = Auth::id();

或者,你可以通過(guò) Illuminate\Http\Request 實(shí)例來(lái)訪問(wèn)已認(rèn)證的用戶。別忘了,類(lèi)型提示的類(lèi)會(huì)被自動(dòng)注入到你的控制器方法中:

<?php
   namespace App\Http\Controllers;
   use Illuminate\Http\Request;
   class ProfileController extends Controller{ 
    /**
     * 更新用戶資料。
     *
     * @param  Request  $request
     * @return Response
     */  
   public function update(Request $request)  
     {       
      // $request->user() 返回一個(gè)認(rèn)證用戶實(shí)例...   
      }
  }

確定當(dāng)前用戶是否已經(jīng)認(rèn)證

你可以使用 Auth facade 的 check 方法來(lái)檢查用戶是否已認(rèn)證。如果已認(rèn)證,將會(huì)返回 true

use Illuminate\Support\Facades\Auth;
if (Auth::check()) {   
 // 用戶已經(jīng)登錄了...
}

{提示} 雖然可以使用 check 方法確認(rèn)用戶是否被認(rèn)證,但是在允許用戶訪問(wèn)的某些路由 / 控制器之前,通常還是會(huì)使用中間件來(lái)驗(yàn)證用戶是否進(jìn)行過(guò)身份驗(yàn)證。想要了解更多信息,請(qǐng)查看有關(guān) 保護(hù)路由 的文檔。

保護(hù)路由

路由中間件 可以用于只允許通過(guò)認(rèn)證的用戶訪問(wèn)給定的路由。Laravel 自帶了一個(gè) auth 中間件,它定義在 Illuminate\Auth\Middleware\Authenticate 中。由于這個(gè)中間件已經(jīng)在 HTTP 內(nèi)核中注冊(cè),你只需把這個(gè)中間件附加到路由定義中:

Route::get('profile', function () {  
  // 只有認(rèn)證過(guò)的用戶可以進(jìn)入...
 })->middleware('auth');

當(dāng)然,如果你使用 控制器,你可以在控制器的構(gòu)造函數(shù)中調(diào)用  middleware 方法來(lái)直接將其附加到路由定義中:

public function __construct(){  
  $this->middleware('auth');
}

重定向未認(rèn)證的用戶

當(dāng) auth 中間件檢測(cè)到一個(gè)未認(rèn)證用戶時(shí),它會(huì)把用戶重定向到名為 login 的 命名路由上。
您可以通過(guò)修改 app/Http/Middleware/Authenticate.php 文件中的 redirectTo 函數(shù)來(lái)修改此行為:

/**
 * Get the path the user should be redirected to.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 */
 protected function redirectTo($request){ 
    return route('login');
 }

指定看守器

當(dāng)你把 auth 中間件添加到路由中時(shí),同時(shí)也能指定使用哪個(gè)看守器進(jìn)行用戶認(rèn)證。指定的看守器應(yīng)該對(duì)應(yīng) auth.php 配置文件中 guards 數(shù)組中的的一個(gè)鍵:

public function __construct(){ 
   $this->middleware('auth:api');
}

登錄限流

如果你使用 Laravel 內(nèi)置的 LoginController 類(lèi),Illuminate\Foundation\Auth\ThrottlesLogins trait 已經(jīng)包含在該控制器中了。默認(rèn)情況下,如果用戶多次嘗試卻無(wú)法提供正確的登錄憑據(jù),那么該用戶在一分鐘內(nèi)將不能再次嘗試登錄。這種限流策略基于用戶的用戶名 / 郵箱地址及其 IP 地址的唯一性。

手動(dòng)驗(yàn)證用戶

不一定非要在 Lavarel 中使用驗(yàn)證控制器。如果選擇刪除這些控制器,就需要直接使用 Lavarel 驗(yàn)證類(lèi)。別擔(dān)心,很容易!

可以借助 Auth facade 訪問(wèn) Laravel 服務(wù),因此需要在類(lèi)的開(kāi)頭導(dǎo)入  Auth 。下面來(lái)看看 attempt 方法:

<?php
    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    class LoginController extends Controller{  
     /**
     * 處理身份驗(yàn)證嘗試。
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return Response
     */   
    public function authenticate(Request $request)   
     {       
        $credentials = $request->only('email', 'password');      
        if (Auth::attempt($credentials)) {        
            // 身份驗(yàn)證通過(guò)...           
           return redirect()->intended('dashboard');    
             }   
           }
        }

attempt 方法的每個(gè)參數(shù)是一個(gè)關(guān)聯(lián)數(shù)組。數(shù)組值用于在數(shù)據(jù)庫(kù)中查找用戶。在上面的例子中,將通過(guò) email 列的值查找用戶。如果找到該用戶,將用存儲(chǔ)在數(shù)據(jù)庫(kù)中的哈希密碼與數(shù)組中的 password 值做比較。不需要對(duì) password 做哈希運(yùn)算,框架在與數(shù)據(jù)庫(kù)中的哈希密碼做比較前自動(dòng)對(duì)此值做哈希運(yùn)算。如果兩個(gè)哈希值匹配,將為該用戶建立驗(yàn)證通過(guò)的 session。

如果驗(yàn)證成功, attempt 方法返回  true ,否則返回 false 。

重定向中的 intended 方法將經(jīng)由身份驗(yàn)證中間件將用戶重定向到身份驗(yàn)證前截獲的 URL 。如果預(yù)期目標(biāo)不存在,可以為此方法指定一個(gè)回退 URI 。

指定額外條件

除了用戶的電子郵件和密碼之外,還可以向身份驗(yàn)證查詢添加其他條件。例如, 我們可以驗(yàn)證用戶是不是已經(jīng)被標(biāo)記為 「激活」:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {  
  // 用戶存在,已激活且未被禁用。
 }

{note} 在這些例子中, email 不是必須的選項(xiàng),它只用來(lái)做示范。你應(yīng)該使用與你的數(shù)據(jù)庫(kù)中 「用戶名」 對(duì)應(yīng)的列名。

訪問(wèn)指定的看守器實(shí)例

可以使用 Auth facade 的 guard 方法指定想要使用的看守器實(shí)例。這允許你使用完全獨(dú)立的可驗(yàn)證模型或用戶表來(lái)管理應(yīng)用程序各個(gè)部分的驗(yàn)證。

傳遞給 guard 方法的看守器名稱(chēng)需要與 auth.php 配置中的配置項(xiàng)之一相匹配:

if (Auth::guard('admin')->attempt($credentials)) { 
   //
 }

登出

用戶登出需要使用 Auth facade 的 logout 方法。它會(huì)清除用戶會(huì)話(session)中的用戶驗(yàn)證信息:

Auth::logout();

記住用戶

如果想在應(yīng)用中提供 「記住我」功能,可以給 attempt 方法傳遞一個(gè)布爾值作為其第二個(gè)參數(shù),這會(huì)無(wú)限期保持用戶身份驗(yàn)證,直到用戶手動(dòng)登出。用戶表需要包含字符串類(lèi)型的 remember_token 列用于存儲(chǔ)令牌。

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { 
   // 用戶被記住...
}

{tip} 如果使用了 Laravel 內(nèi)置的 LoginController,「記住」用戶的正確邏輯已經(jīng)由控制器所用的 traits 實(shí)現(xiàn)。

如果啟用了「記住用戶」,可以使用 viaRemember 方法判斷是否使用了「記住我」cookie 對(duì)用戶做身份驗(yàn)證:

if (Auth::viaRemember()) { 
   //
}

其它身份驗(yàn)證方法

驗(yàn)證用戶實(shí)例

如果要將已經(jīng)存在的用戶登入應(yīng)用,可以調(diào)用 login 方法,并以用戶實(shí)例作為其參數(shù) 。該對(duì)象必須實(shí)現(xiàn) Illuminate\Contracts\Auth\Authenticatable 契約 。Laravel 自帶的 App\User 模型已經(jīng)實(shí)現(xiàn)了這個(gè)接口:

Auth::login($user);
// 登錄并「記住」給定的用戶...
Auth::login($user, true);

使用如下方式指定想要的看守器實(shí)例:

Auth::guard('admin')->login($user);

通過(guò) ID 驗(yàn)證用戶身份

可以使用 loginUsingId 方法通過(guò) ID 將用戶登錄到應(yīng)用。這個(gè)方法接受希望驗(yàn)證身份用戶的主鍵:

Auth::loginUsingId(1);
// 登錄并「記住」給定用戶...
Auth::loginUsingId(1, true);

僅驗(yàn)證一次用戶身份

可以使用 once 方法在單次請(qǐng)求中將用戶登錄到應(yīng)用中。這樣做將不使用 session 或 cookies,這意味著此方法有助于構(gòu)建一個(gè)無(wú)狀態(tài) API:

if (Auth::once($credentials)) {
    //
  }

HTTP 基礎(chǔ)認(rèn)證

HTTP 基礎(chǔ)認(rèn)證 提供了一種快速方法來(lái)驗(yàn)證你應(yīng)用程序中的用戶,而無(wú)需設(shè)置專(zhuān)用的「登錄」頁(yè)面。 開(kāi)始之前, 先把 auth.basic 中間件 附加到你的路由中。auth.basic 中間件已包含在 Laravel 框架中,所以你不需要定義它:

Route::get('profile', function () { 
   // 只有認(rèn)證過(guò)的用戶可以進(jìn)入...
 })->middleware('auth.basic');

將中間件附加到路由后,在瀏覽器中訪問(wèn)此路由時(shí)將自動(dòng)提示您輸入憑據(jù)。默認(rèn)的,auth.basic 中間件把用戶記錄上的 email 字段 作為「用戶名」。

FastCGI 的注意事項(xiàng)

如果你正使用 PHP FastCGI 模式,HTTP 基礎(chǔ)認(rèn)證可能無(wú)法正常工作。需要把下面幾行添加到你的 .htaccess 文件中:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

無(wú)狀態(tài) HTTP 基礎(chǔ)認(rèn)證

你也可以使用 HTTP 基礎(chǔ)身份驗(yàn)證,而無(wú)需在會(huì)話中設(shè)置用戶標(biāo)識(shí)符 cookie,這對(duì) API 的身份驗(yàn)證特別有用。為此 ,請(qǐng)定義一個(gè)中間件 它將調(diào)用 onceBasic 方法。如果 onceBasic 方法沒(méi)有返回任何響應(yīng),那么請(qǐng)求就可以進(jìn)一步傳遞到應(yīng)用程序中:

<?php
  namespace App\Http\Middleware;
  use Illuminate\Support\Facades\Auth;
  class AuthenticateOnceWithBasicAuth{   
       /**
     * 處理傳入的請(qǐng)求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */  
  public function handle($request, $next)  
    {       
       return Auth::onceBasic() ?: $next($request);  
     }
   }

接著, 注冊(cè)路由中間件 并將它附加到路由:

Route::get('api/user', function () {  
  // 只有認(rèn)證過(guò)的用戶可以進(jìn)入...
})->middleware('auth.basic.once');

退出

要手動(dòng)把用戶從應(yīng)用中退出登錄,你可以使用 Auth facade 上的 logout 方法。這將清除用戶會(huì)話中的身份認(rèn)證信息:

use Illuminate\Support\Facades\Auth;Auth::logout();

讓其它設(shè)備上的 Session 失效

Laravel 還提供了一種機(jī)制,用于將其它設(shè)備上的用戶 Session 失效和「注銷(xiāo)」,而不會(huì)使其當(dāng)前設(shè)備上的 Session 失效。首先,你需要保證 Illuminate\Session\Middleware\AuthenticateSession 中間件在你的 app/Http/Kernel.php 類(lèi)中的 web 中間件組中,并且沒(méi)有被注釋掉:

'web' => [   
    // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,  
    // ...
  ],

然后, 你就可以使用 Auth facade 上的 logoutOtherDevices 方法。此方法要求用戶提供其當(dāng)前密碼,你的應(yīng)用程序應(yīng)通過(guò)輸入表單接受該密碼:

use Illuminate\Support\Facades\Auth;
Auth::logoutOtherDevices($password);

{note} 當(dāng)調(diào)用 logoutOtherDevices 方法后,用戶的其它 Session 將完全失效,這意味著他們將「退出」他們之前通過(guò)身份認(rèn)證的所有看守器。

添加自定義的看守器

你可以使用 Auth facade 的 extend 方法來(lái)定義自己的身份驗(yàn)證看守器。你應(yīng)該在 服務(wù)提供器 中調(diào)用  extend 方法。由于 Laravel 已經(jīng)附帶了 AuthServiceProvider,我們可以將代碼放在該提供器中:

<?php
  namespace App\Providers;
  use App\Services\Auth\JwtGuard;
  use Illuminate\Support\Facades\Auth;
  use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
  class AuthServiceProvider extends ServiceProvider{   
      /**
     * 注冊(cè)任意應(yīng)用認(rèn)證/授權(quán)服務(wù)。
     *
     * @return void
     */   
  public function boot()  
   {      
     $this->registerPolicies();        
     Auth::extend('jwt', function ($app, $name, array $config) {         
       // 返回一個(gè) Illuminate\Contracts\Auth\Guard 實(shí)例...           
        return new JwtGuard(Auth::createUserProvider($config['provider']));     
         });   
    }}

正如你在上面的示例中所看到的,傳遞給 extend 方法的回調(diào)應(yīng)該返回一個(gè)實(shí)現(xiàn) Illuminate\Contracts\Auth\Guard 接口的實(shí)例。這個(gè)接口包含了一些你需要在自定義的看守器中實(shí)現(xiàn)的方法。當(dāng)你的自定義看守器定義完成之后,你可以在 auth.php 配置文件的 guards 配置中使用這個(gè)看守器:

'guards' => [  
  'api' => [     
     'driver' => 'jwt',        
     'provider' => 'users',    
     ],
  ],

請(qǐng)求閉包看守器

實(shí)現(xiàn)基于 HTTP 請(qǐng)求的自定義身份驗(yàn)證系統(tǒng)的最簡(jiǎn)單方法,是使用 Auth::viaRequest 方法。此方法允許您使用單個(gè)閉包來(lái)快速定義身份驗(yàn)證過(guò)程。

首先,在 AuthServiceProviderboot 方法中調(diào)用 Auth::viaRequest 方法。viaRequest 方法接受一個(gè)看守器名稱(chēng)作為其第一個(gè)參數(shù)。此名稱(chēng)可以是描述你自定義看守器的任何字符串。傳遞給該方法的第二個(gè)參數(shù)應(yīng)該是一個(gè)閉包函數(shù),它接收傳入的 HTTP 請(qǐng)求并返回一個(gè)用戶實(shí)例,或者,如果驗(yàn)證失敗,則為 null

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
  /**
 * 注冊(cè)任意應(yīng)用認(rèn)證/授權(quán)服務(wù)。
 *
 * @return void
 */
 public function boot(){  
   $this->registerPolicies();  
    Auth::viaRequest('custom-token', function ($request) {     
       return User::where('token', $request->token)->first();  
       });
     }

當(dāng)你完成了自定義看守器后,就可以在 auth.php 配置文件的 guards 配置中使用這個(gè)看守器:

'guards' => [   
 'api' => [      
   'driver' => 'custom-token',  
   ],
 ],

添加自定義用戶提供器

如果不使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)用戶,就需要使用自己的身份驗(yàn)證用戶提供器擴(kuò)展 Lavarel。可以使用 Auth facade 的 provider 方法自定義用戶提供器:

<?php
    namespace App\Providers;
    use Illuminate\Support\Facades\Auth;
    use App\Extensions\RiakUserProvider;
    use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
    class AuthServiceProvider extends ServiceProvider{   
        /**
     * 注冊(cè)任意應(yīng)用身份驗(yàn)證 / 授權(quán)服務(wù)Register any application authentication / authorization services.
     *
     * @return void
     */   
      public function boot()   
       {      
         $this->registerPolicies();       
         Auth::provider('riak', function ($app, array $config) {         
            // 返回 Illuminate\Contracts\Auth\UserProvider 實(shí)例...            
            return new RiakUserProvider($app->make('riak.connection'));       
           });   
        }}

一旦使用 provider 方法注冊(cè)完畢,就可以在 auth.php 配置文件中切換到新的用戶提供器。先定義一個(gè)使用新驅(qū)動(dòng)的 provider

'providers' => [  
  'users' => [      
    'driver' => 'riak',  
      ],
  ],

隨后就可以在 guards 配置中使用這個(gè)提供器:

'guards' => [   
    'web' => [     
       'driver' => 'session',        
       'provider' => 'users',    
     ],
  ],

用戶提供器契約

Illuminate\Contracts\Auth\UserProvider 實(shí)現(xiàn)僅負(fù)責(zé)從 MySQL、Riak 等持久化存儲(chǔ)系統(tǒng)中提取 Illuminate\Contracts\Auth\Authenticatable 實(shí)現(xiàn)。無(wú)論用戶如何存儲(chǔ)及用于表示它的類(lèi)是什么類(lèi)型,這兩個(gè)接口都允許 Laravel 身份驗(yàn)證機(jī)制繼續(xù)運(yùn)行:

我們來(lái)看看 Illuminate\Contracts\Auth\UserProvider 契約:

<?php
    namespace Illuminate\Contracts\Auth;
    interface UserProvider {  
      public function retrieveById($identifier);    
      public function retrieveByToken($identifier, $token);    
      public function updateRememberToken(Authenticatable $user, $token);    
      public function retrieveByCredentials(array $credentials);    
      public function validateCredentials(Authenticatable $user, array $credentials);
     }

retrieveById 函數(shù)通常接受用于表示類(lèi)的 key(如 MySQL 數(shù)據(jù)庫(kù)中自動(dòng)遞增的 ID)作為參數(shù),并獲取和返回與這個(gè) ID 匹配的 Authenticatable 實(shí)現(xiàn)。

retrieveByToken 函數(shù)通過(guò)用戶的唯一 $identifier 和存儲(chǔ)在 remember_token 列的 「記住我」 令牌獲取用戶。與前一方法相同,它返回 Authenticatable 實(shí)現(xiàn)。

updateRememberToken 方法用新  $token 更新  $userremember_token 列。在「記住我」登錄校驗(yàn)成功或者用戶登出時(shí)分配「刷新令牌」。

在嘗試登錄到應(yīng)用時(shí),retrieveByCredentials 方法接受憑證數(shù)組傳遞給 Auth::attempt 方法。此方法在底層持久化存儲(chǔ)中「查詢」與這些憑證匹配的用戶。通常,此方法運(yùn)行一個(gè)基于 $credentials['username'] 的 「where」 條件,它應(yīng)該返回一個(gè) Authenticatable 實(shí)現(xiàn)。此方法不就嘗試進(jìn)行任何密碼校驗(yàn)或身份驗(yàn)證。

validateCredentials 方法應(yīng)該比較給定的 $user$credentials 來(lái)驗(yàn)證用戶身份。例如,此方法或許應(yīng)該使用 Hash::check 來(lái)比較 $user->getAuthPassword() 的值與 $credentials['password'] 的值。它應(yīng)該返回 truefalse ,以表明用戶密碼是否有效。

身份驗(yàn)證契約

我們已經(jīng)剖析了 UserProvider 的每個(gè)方法。下面再來(lái)看看 Authenticatable 契約。切記,用戶提供器的 retrieveById、 retrieveByTokenretrieveByCredentials 方法將返回此接口的實(shí)例:

<?php
   namespace Illuminate\Contracts\Auth;
   interface Authenticatable {   
      public function getAuthIdentifierName();    
      public function getAuthIdentifier();    
      public function getAuthPassword();    
      public function getRememberToken();    
      public function setRememberToken($value);    
      public function getRememberTokenName();
     }

這個(gè)接口很簡(jiǎn)單。 getAuthIdentifierName 方法應(yīng)該返回用戶 「主鍵」 列的名字, getAuthIdentifier 方法則返回用戶 「主鍵」。在 MySQL 后臺(tái),它會(huì)是自增主鍵。 getAuthPassword 方法應(yīng)該返回用戶的哈希密碼。此接口允許身份驗(yàn)證系統(tǒng)與任一 User 類(lèi)一直工作,不管使用的是哪種 ORM 或抽象存儲(chǔ)層。默認(rèn)情況下,Laravel 的 app 目錄會(huì)包含一個(gè)實(shí)現(xiàn)了此接口的 User 類(lèi),你可以以這個(gè)實(shí)現(xiàn)示例作為參考。

事件

在身份驗(yàn)證處理過(guò)程中 Laravel 引發(fā)了多種 事件 。 可以在  EventServiceProvider 中附著這些事件的監(jiān)聽(tīng)器:

/**
 * 應(yīng)用的事件監(jiān)聽(tīng)器映射。
 *
 * @var array
 */
 protected $listen = [   
    'Illuminate\Auth\Events\Registered' => [     
       'App\Listeners\LogRegisteredUser',  
       ],  
     'Illuminate\Auth\Events\Attempting' => [     
        'App\Listeners\LogAuthenticationAttempt', 
         ],  
      'Illuminate\Auth\Events\Authenticated' => [    
         'App\Listeners\LogAuthenticated',   
        ],  
      'Illuminate\Auth\Events\Login' => [     
         'App\Listeners\LogSuccessfulLogin',   
        ],  
      'Illuminate\Auth\Events\Failed' => [     
         'App\Listeners\LogFailedLogin',   
        ], 
      'Illuminate\Auth\Events\Logout' => [      
           'App\Listeners\LogSuccessfulLogout',  
           ],   
       'Illuminate\Auth\Events\Lockout' => [     
         'App\Listeners\LogLockout',   
         ],  
       'Illuminate\Auth\Events\PasswordReset' => [     
         'App\Listeners\LogPasswordReset',   
         ],
      ];
本文章首發(fā)在 LearnKu.com 網(wǎng)站上。