青柠檬檬哒|| Laravel 用户授权原来内置了这么多方法,3分钟短文
引言laravel已经内置了一套授权和权限分配的功能 , 我们不用从零开始设计 , 这方便了很多 。 但是 , 因为集成在框架内的缘故 , 很多时候对于用户体系甚至有些陌生 。 本文通过一个简单的需求 , 判断有效用户 , 逐一为大家实现 。
我们需要在LoginController内重写login方法 。 该方法接收一个请求体:
publicfunctionlogin(IlluminateHttpRequest$request){}验证请求参数是否有效:
$this->validateLogin($request);如果用户请求频次超限被锁定 , 则直接返回:
if($this->hasTooManyLoginAttempts($request)){$this->fireLockoutEvent($request);return$this->sendLockoutResponse($request);}请求参数正常 , 接着验证用户的账号密码是否正确:
$ok=$this->guard()->validate($this->credentials($request));【青柠檬檬哒|| Laravel 用户授权原来内置了这么多方法,3分钟短文】如果账号密码错误 , 则增加请求计数频次:
$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);并给出错误提示 , 比较自由 , 可附加提示信息:
returnredirect()->back()->withInput($request->only($this->username(),'remember'))->withErrors(['active'=>'Youmustbeactivetologin.']);至此 , 登陆筛选的逻辑就完成了 。
简化版如果像上一节那样大改login方法你觉得有些困难 , 那我们可以来一个简化版 , 在登陆验证阶段 , 直接验证用户 , 并给出错误提示 。
我们知道控制器继承了Validator , 可以直接使用validate方法手动构建验证规则:
考虑以下代码:
protectedfunctionvalidateLogin(Request$request){$this->validate($request,[$this->username()=>'exists:users,'.$this->username().',active,1','password'=>'required|string',]);}我们在控制器内调用该方法进行过滤验证即可 。
写在最后本文通过一步步实现用户登录验证流程的方式 , 将自定义的逻辑嵌入到登录处理流程内 , 这是一种魔改 。 当然在请求阶段 , 在应用逻辑处理到响应体之前 , 你都有机会干预此次请求 。 laravel毕竟太灵活了 。
Happycoding:-)
我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。
推荐阅读
- 程序员小助手|ORM 模型用法纲要,3分钟短文:Laravel
- 青柠檬檬哒|无线电二厂虎啸,可做蓝牙音箱的功能机
- 柠檬少年|一加8pro的使用开箱及初体验
- 青柠檬檬哒|我们是认真的!乔思伯U5S装机,只为显卡站起来
- 柠檬少年|英伟达这次直接把牙膏挤穿了……,没听小编买20显卡的都哭了
- 柠檬少年|Windows摇身一变成Mac,我的天
- 柠檬少年|这3款手机的颜值和实力共存,女生适合入手的5G手机
- 产业气象站|& Laravel 表单验证数组的数据,3分钟短文
- 柠檬少年|还剩一块碎片,时间还有24天,今日头条领取手机碎片换手机
- 柠檬少年|被网友批为崇洋媚外,雷军:华为用就没事?,小米用外国人拍海报