那麼在 Jetstream 如何做自定義認證呢,需要增加 authenticateUsing 方法來自定義自己的登入邏輯。
App\Providers\JetstreamServiceProvider.php 的 boot 方法增加以下程式碼
Fortify::authenticateUsing(function (Request $request) { $user = User::where('email', $request->email)->first(); if ($user && Hash::check($request->password, $user->password)) { return $user; } }); }
如果該方法的返回值是:null 或者 false ,則代表登入失敗。
在登入驗證時,Fortify 預設會用 email 作為使用者名稱來進行驗證,如果只要自定義這個欄位,不需要像上面那麼麻煩,只需要修改
config\fortify.php
檔案的'username' => 'email',
為你想要的名字即可。
例如前端使用了手機號進行驗證,那麼可以把 username 修改為 phone。我們在整合使用者認證功能時,不僅需要使用者名稱、密碼這兩個資訊進行登入驗證,還需要其他專案一同驗證,例如增加一個驗證碼。
常用的驗證碼擴充套件包有很多,例如mews/captcha
擴充套件包就可以無縫和 Laravel 進行整合,在登入驗證時額外增加對驗證碼的必填、正確性驗證即可。經過測試,直接在自定義方法中寫驗證是不可以的,例如下面的寫法:Fortify::authenticateUsing(function (Request $request) { // 對前端驗證碼進行必填、正確性驗證 $request->validate([ 'validCode' => 'required|captcha' ]); $user = User::where('email', $request->email)->first(); if ($user && Hash::check($request->password, $user->password)) { return $user; } });
因為 Laravel\Fortify\Http\Controllers\AuthenticatedSessionController
的 store 方法使用了 Request 的方式對前端提交的資料進行了驗證,所以在此呼叫驗證方法,會重複驗證,導致驗證碼一直無法通過驗證。
該如何處理呢?容我在研究下。
本作品採用《CC 協議》,轉載必須註明作者和本文連結