laravel已經內置了一套授權和權限分配的功能,我們不用從零開始設計,這方便了很多。但是, 因為集成在框架內的緣故,很多時候對于用戶體系甚至有些陌生。本文通過一個簡單的需求,判斷有效用戶, 逐一為大家實現。

學習時間
比如在前端有一個界面,表單的提交參數如下:
<form class="form-horizontal" role="form" method="POST" action="{{ url('/auth/login') }}">
其中路由 /auth/login 是框架內集成的方法。如果有效的數據則進行驗證登陸,如果無效則執行錯誤邏輯。 那么問題來了,能否手動實現這些邏輯呢。或者說,為了防止無效的暴力請求,在表單開始之初, 能否直接過濾掉一些垃圾請求,過濾掉根本不存在的用戶,或者被禁止的用戶呢?
我們需要在 LoginController 內重寫 login 方法。該方法接收一個請求體:
public function login(IlluminateHttpRequest $request) {}
驗證請求參數是否有效:
$this->validateLogin($request);
如果用戶請求頻次超限被鎖定,則直接返回:
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
請求參數正常,接著驗證用戶的賬號密碼是否正確:
$ok = $this->guard()->validate($this->credentials($request));
如果賬號密碼錯誤,則增加請求計數頻次:
$this->incrementLoginAttempts($request);
拋出一個登陸錯誤的提示頁面:
return $this->sendFailedLoginResponse($request);
如果用戶賬號密碼正確,也就是登陸成功了。首先獲取用戶模型:
$user = $this->guard()->getLastAttempted();
接著就是我們需求中所說的業務邏輯,可以過濾用戶是否active。使用判斷:
$is_active = $user->active && $this->attemptLogin($request);
如果邏輯通過,則將頁面導航到成功后頁面:
return $this->sendLoginResponse($request);
如果不通過,大概率這用戶是無效非法的,累加其登陸頻次計數:
$this->incrementLoginAttempts($request);
并給出錯誤提示,比較自由,可附加提示信息:
return redirect()->back()->withInput($request->only($this->username(), 'remember'))->withErrors(['active' => 'You must be active to login.']);
至此,登陸篩選的邏輯就完成了。
簡化版
如果像上一節那樣大改login方法你覺得有些困難,那我們可以來一個簡化版, 在登陸驗證階段,直接驗證用戶,并給出錯誤提示。
我們知道控制器繼承了 Validator,可以直接使用 validate 方法手動構建驗證規則:
考慮以下代碼:
protected function validateLogin(Request $request)
{
$this->validate($request, [
$this->username() => 'exists:users,' . $this->username() . ',active,1',
'password' => 'required|string',
]);
}
我們在控制器內調用該方法進行過濾驗證即可。
寫在最后
本文通過一步步實現用戶登錄驗證流程的方式,將自定義的邏輯嵌入到登錄處理流程內, 這是一種魔改。當然在請求階段,在應用邏輯處理到響應體之前,你都有機會干預此次請求。 laravel畢竟太靈活了。
HAppy coding :-)
我是@程序員小助手,持續分享編程知識,歡迎關注。