今天在寫Laravel登錄的時候墙杯,根據(jù)需求也不想用laravel自帶的auth登錄認證蛾坯,便在搜索了一番仲墨,開始了auth的深入探究之旅。
剛開始根據(jù)官方文檔揍障,用戶認證 里的手動認證用戶描述宗收,實現(xiàn)了我的簡單登錄邏輯代碼,如下:
public function login(Request $request)
{
if (Auth::attempt(['name' => $request->name, 'password' => $request->password])) {
//認證通過
$rt = array('status' => 200, 'msg' => '登陸成功', 'data' => array('isLogin' => true));
} else {
$rt = array('status' => 400, 'msg' => '登陸失敗', 'data' => array('isLogin' => false));
}
return response()->json($rt);
}
然后順著laravel Auth的邏輯亚兄,找到在 Illuminate\Auth\Guard.php 中的 attempt 方法混稽,如下圖:
根據(jù)代碼的實現(xiàn),最關鍵的點應該是以下兩句代碼:
$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);
$this->hasValidCredentials($user, $credentials)
我們一句一句來审胚,順著 retrieveByCredentials 方法匈勋,這里要說明的是,因為在 config/auth.php 中我選擇的是 eloquent 認證驅(qū)動膳叨,所以找到 Illuminate\AuthEloquentUserProvider 下的 retrieveByCredentials方法洽洁,如下圖:
retrieveByCredentials 方法實現(xiàn)了根據(jù)用戶登錄輸入的信息(除密碼外),查詢到登錄用戶的信息并返回菲嘴。
然后執(zhí)行 $this->hasValidCredentials($user, $credentials), 最終定位到 Illuminate\AuthEloquentUserProvider 中的 validateCredentials方法饿自,如下圖:
最終Laravel 通過 Hash facade 提供 Bcrypt 加密來驗證用戶密碼是否一致。(注意:數(shù)據(jù)庫密碼字段名為 password龄坪,若不是需在模型方法中重新指定)
看到了這里昭雌,也有了一些疑問,如果我不用hash來加密密碼呢健田,使用md5 + "鹽" 的方式烛卧,那就只有改寫這個驗證邏輯了。("鹽" 在數(shù)據(jù)庫中字段名為 salt)
在 Illuminate\Contracts\Auth\Authenticatable 中加入方法:
public function getAuthSalt();
在 Illuminate\Auth\Authenticatable 加入方法:
public function getAuthSalt()
{
return $this->salt;
}
改寫上文提到的 retrieveByCredentials 方法
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
$authPassword = $user->getAuthPassword();
$authSalt = $user->getAuthSalt();
return $authPassword === md5($plain.$authSalt);
}
到這里基本就結(jié)束了妓局,需要注意的是总放,使用Auth認證默認是 App\User.php,我根據(jù)需求更改了 config/auth.php,改成了 App\Models\User.php 因為該文件我是執(zhí)行命令 php artisan make:model Models/User 生成的好爬,便有了一點小坑的地方局雄,它沒有 use Auth 認證的類,所以此時將 app/User.php 下的復制過來即可存炮。
以下是我在學習時炬搭,找到的兩篇關于laravel auth 的文章,對我理解auth有很大的幫助