青柠檬檬哒|| Laravel 用户授权原来内置了这么多方法,3分钟短文

引言laravel已经内置了一套授权和权限分配的功能 , 我们不用从零开始设计 , 这方便了很多 。 但是 , 因为集成在框架内的缘故 , 很多时候对于用户体系甚至有些陌生 。 本文通过一个简单的需求 , 判断有效用户 , 逐一为大家实现 。
其中路由/auth/login是框架内集成的方法 。 如果有效的数据则进行验证登陆 , 如果无效则执行错误逻辑 。 那么问题来了 , 能否手动实现这些逻辑呢 。 或者说 , 为了防止无效的暴力请求 , 在表单开始之初 , 能否直接过滤掉一些垃圾请求 , 过滤掉根本不存在的用户 , 或者被禁止的用户呢?
我们需要在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:-)
我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。


    推荐阅读