Laravel框架自定義驗(yàn)證過(guò)程實(shí)例分析
本文實(shí)例講述了Laravel框架自定義驗(yàn)證過(guò)程。分享給大家供大家參考,具體如下:
首先,你需要明白一點(diǎn),當(dāng)你開(kāi)啟auth中間件的時(shí)候,其實(shí)是調(diào)用了在app/Http/Kernel.php中的
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
但是這里先不用去糾結(jié)這個(gè)文件,這里直接看開(kāi)啟這個(gè)驗(yàn)證之后會(huì)怎樣。首先,如果你去訪(fǎng)問(wèn)開(kāi)啟這個(gè)驗(yàn)證的控制器,但是你又沒(méi)有登錄的話(huà),那么會(huì)默認(rèn)去搜索login路由,所以你需要在路由中設(shè)置該路由:
Route::get('login','AnyControllerName@AnyFunctionName')->name('login');
而且雖然name('login')
可設(shè)可不設(shè),但是最好加上。接著頁(yè)面就會(huì)跳轉(zhuǎn)到你設(shè)置的供用戶(hù)填寫(xiě)表單的頁(yè)面,該表單的提交路由你也一樣要設(shè)置好:
Route::post('login','AnyControllerName@AnyFunctionName');
其實(shí)由于這里已經(jīng)由我們可控了,即,我們可以手動(dòng)確定表單提交到哪個(gè)控制器以及對(duì)應(yīng)該控制器下的方法,所以接下來(lái)的問(wèn)題就是如何使Laravel知道我們確定該用戶(hù)已經(jīng)通過(guò)了驗(yàn)證了。
這個(gè)時(shí)候可以使用Auth::attempt()
函數(shù),這個(gè)函數(shù)的作用原理是將你傳遞進(jìn)去的數(shù)組,比如下面:
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 ]); }
下面是重點(diǎn)?。?!
其中,我們使用了3個(gè)參數(shù)$user_name,$user_id,$password,attempt會(huì)把除了$password之外的內(nèi)容作為$where的內(nèi)容,從數(shù)據(jù)庫(kù)中搜索記錄,如果記錄為0,那么當(dāng)然不用說(shuō)了,驗(yàn)證失敗,但是存在該記錄時(shí),就需要去匹配$password是否正確。
laravel保存$password的方式是使用PHP的函數(shù)password_hash,該函數(shù)能計(jì)算傳入值的哈希值,而且該函數(shù)需要第二個(gè)參數(shù),指定哈希處理的方式,Laravel中該參數(shù)名為PASSWORD_BCRYPT,Laravel會(huì)將密碼經(jīng)過(guò)該函數(shù)處理后再保存。(至于如何做到的,暫時(shí)沒(méi)有機(jī)會(huì)深究。)
假設(shè)你的密碼為123456,那么你保存在數(shù)據(jù)庫(kù)中的值就是
password_hash('123456','PASSWORD_BCRYPT')
Auth::attempt()
會(huì)將你提交過(guò)來(lái)的值,做password_hash($post_password,'PASSWORD_BCRYPT')
處理,然后跟數(shù)據(jù)庫(kù)中的存儲(chǔ)值進(jìn)行比較,相等則驗(yàn)證通過(guò),不相等,則自然驗(yàn)證失敗。
驗(yàn)證通過(guò)后,使用Auth::login(Auth::user());
就可以完成用戶(hù)的登錄驗(yàn)證了。
這里再穿插一個(gè)知識(shí)點(diǎn),當(dāng)你使用Eloquent作為數(shù)據(jù)庫(kù)驅(qū)動(dòng)時(shí),你需要新建一個(gè)用戶(hù)類(lèi),User.php,你可以使用命令行來(lái)新建該模型,也可以直接手動(dòng)新建,但是注意,命令行新建的該模型是存在問(wèn)題的,Auth::attempt()
中會(huì)去嘗試調(diào)用該模型,但是其中調(diào)用的類(lèi)類(lèi)型不是Model?。?!所以你自以為新建好了User.php后,發(fā)現(xiàn)會(huì)報(bào)以下錯(cuò)誤:
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
簡(jiǎn)單來(lái)說(shuō)就是你傳遞的參數(shù)錯(cuò)誤了,以下是錯(cuò)誤演示:
namespace App\Model; use Illuminate\Database\Eloquent\Model; class User extends Model { }
你只要把User.php模型修改成下面的形式就對(duì)了:
<?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; // 這個(gè)參數(shù)是關(guān)于軟刪除的,如果你有軟刪除需要,那么你可以加上 // use SoftDeletes; }
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Laravel框架入門(mén)與進(jìn)階教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php 模擬 asp.net webFrom 按鈕提交事件實(shí)例
需要php方面的項(xiàng)目開(kāi)發(fā),php剛剛?cè)腴T(mén),在寫(xiě)按鈕提交過(guò)程中,asp.net里的按鈕事件更好些,下面有個(gè)實(shí)例,大家可以看看2014-10-10PHP中通過(guò)trigger_error觸發(fā)PHP錯(cuò)誤示例
這篇文章主要介紹了PHP中通過(guò)trigger_error觸發(fā)PHP錯(cuò)誤示例,本文介紹了錯(cuò)誤抑制符@以及通過(guò) trigger_error 觸發(fā) PHP 錯(cuò)誤示例,需要的朋友可以參考下2015-06-06php中使用gd庫(kù)實(shí)現(xiàn)下載網(wǎng)頁(yè)中所有圖片
這篇文章主要介紹了php中使用gd庫(kù)實(shí)現(xiàn)下載網(wǎng)頁(yè)中所有圖片,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05ajax在joomla中的原生態(tài)應(yīng)用代碼
一般很少看到j(luò)oomla中使用ajax,筆者以前說(shuō)到過(guò)用jquery來(lái)實(shí)現(xiàn),對(duì)于那些驗(yàn)證用戶(hù)名不能重復(fù),郵箱不能重復(fù),以及聯(lián)動(dòng)菜單,等等的應(yīng)用,使用ajax是免不了的2012-07-07yii框架配置默認(rèn)controller和action示例
這篇文章主要介紹了yii框架配置默認(rèn)controller和action示例,需要的朋友可以參考下2014-04-04YII CLinkPager分頁(yè)類(lèi)擴(kuò)展增加顯示共多少頁(yè)
yii的分頁(yè)類(lèi)CLinkPager默認(rèn)是不支持顯示共x頁(yè)的,那么現(xiàn)在接的項(xiàng)目有這樣的需求,怎么辦呢?下面通過(guò)本文給大家介紹YII CLinkPager分頁(yè)類(lèi)擴(kuò)展增加顯示共多少頁(yè)的實(shí)例代碼,需要的朋友參考下吧2016-01-01phpStudy配置多站點(diǎn)多域名方法及遇到的403錯(cuò)誤解決方法
這篇文章主要介紹了phpStudy配置多站點(diǎn)多域名方法及遇到的403錯(cuò)誤解決方法,需要的朋友可以參考下2017-10-10Win7 64位系統(tǒng)下PHP連接Oracle數(shù)據(jù)庫(kù)
項(xiàng)目中遇到一個(gè)問(wèn)題,即怎么在Windows下連接Oracle進(jìn)行開(kāi)發(fā)。幾乎所有的例子都是基于Mysql的,Oracle的連接本身在Windows平臺(tái)下就顯得比較復(fù)雜。這里便長(zhǎng)話(huà)短說(shuō),只記錄有用部分,希望對(duì)大家有所幫助2014-08-08