您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何使用Laravel框架自定義驗證,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
首先,你需要明白一點,當你開啟auth中間件的時候,其實是調用了在app/Http/Kernel.php中的
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
但是這里先不用去糾結這個文件,這里直接看開啟這個驗證之后會怎樣。首先,如果你去訪問開啟這個驗證的控制器,但是你又沒有登錄的話,那么會默認去搜索login路由,所以你需要在路由中設置該路由:
Route::get('login','AnyControllerName@AnyFunctionName')->name('login');
而且雖然name('login')
可設可不設,但是最好加上。接著頁面就會跳轉到你設置的供用戶填寫表單的頁面,該表單的提交路由你也一樣要設置好:
Route::post('login','AnyControllerName@AnyFunctionName');
其實由于這里已經由我們可控了,即,我們可以手動確定表單提交到哪個控制器以及對應該控制器下的方法,所以接下來的問題就是如何使Laravel知道我們確定該用戶已經通過了驗證了。
這個時候可以使用Auth::attempt()
函數,這個函數的作用原理是將你傳遞進去的數組,比如下面:
public function checkLogin(Request $request){ $user_name=$request->user_name; $user_id=$request->user_id; $password=$request->password; Auth::attempt([ 'user_name'=>$user_name, 'user_id'=>$user_id, 'password'=>$password ]); }
下面是重點!!!
其中,我們使用了3個參數$user_name,$user_id,$password,attempt會把除了$password之外的內容作為$where的內容,從數據庫中搜索記錄,如果記錄為0,那么當然不用說了,驗證失敗,但是存在該記錄時,就需要去匹配$password是否正確。
laravel保存$password的方式是使用PHP的函數password_hash,該函數能計算傳入值的哈希值,而且該函數需要第二個參數,指定哈希處理的方式,Laravel中該參數名為PASSWORD_BCRYPT,Laravel會將密碼經過該函數處理后再保存。(至于如何做到的,暫時沒有機會深究。)
假設你的密碼為123456,那么你保存在數據庫中的值就是
password_hash('123456','PASSWORD_BCRYPT')
Auth::attempt()
會將你提交過來的值,做password_hash($post_password,'PASSWORD_BCRYPT')
處理,然后跟數據庫中的存儲值進行比較,相等則驗證通過,不相等,則自然驗證失敗。
驗證通過后,使用Auth::login(Auth::user());
就可以完成用戶的登錄驗證了。
這里再穿插一個知識點,當你使用Eloquent作為數據庫驅動時,你需要新建一個用戶類,User.php,你可以使用命令行來新建該模型,也可以直接手動新建,但是注意,命令行新建的該模型是存在問題的,Auth::attempt()
中會去嘗試調用該模型,但是其中調用的類類型不是Model!!!所以你自以為新建好了User.php后,發現會報以下錯誤:
Argument 1 passed to
Illuminate\Auth\EloquentUserProvider::validateCredentials()
must be an instance of
Illuminate\Contracts\Auth\Authenticatable,
instance of
App\User
given, called in /var/www/sample/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php on line 379 and defined
簡單來說就是你傳遞的參數錯誤了,以下是錯誤演示:
namespace App\Model; use Illuminate\Database\Eloquent\Model; class User extends Model { }
你只要把User.php模型修改成下面的形式就對了:
<?php namespace App; use Illuminate\Auth\Authenticatable; use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; use Illuminate\Database\Eloquent\SoftDeletes; class User extends Model implements AuthenticatableContract { use Authenticatable, CanResetPassword; // 這個參數是關于軟刪除的,如果你有軟刪除需要,那么你可以加上 // use SoftDeletes; }
以上就是如何使用Laravel框架自定義驗證,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。