Laravel框架自定义验证过程实例分析


Posted in PHP onFebruary 01, 2019

本文实例讲述了Laravel框架自定义验证过程。分享给大家供大家参考,具体如下:

首先,你需要明白一点,当你开启auth中间件的时候,其实是调用了在app/Http/Kernel.php中的

'auth' => \Illuminate\Auth\Middleware\Authenticate::class,

但是这里先不用去纠结这个文件,这里直接看开启这个验证之后会怎样。首先,如果你去访问开启这个验证的控制器,但是你又没有登录的话,那么会默认去搜索login路由,所以你需要在路由中设置该路由:

Route::get('login','AnyControllerName@AnyFunctionName')->name('login');

而且虽然name('login')可设可不设,但是最好加上。接着页面就会跳转到你设置的供用户填写表单的页面,该表单的提交路由你也一样要设置好:

Route::post('login','AnyControllerName@AnyFunctionName');

其实由于这里已经由我们可控了,即,我们可以手动确定表单提交到哪个控制器以及对应该控制器下的方法,所以接下来的问题就是如何使Laravel知道我们确定该用户已经通过了验证了。

这个时候可以使用Auth::attempt()函数,这个函数的作用原理是将你传递进去的数组,比如下面:

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
  ]);
}

下面是重点!!!

其中,我们使用了3个参数$user_name$user_id$password,attempt会把除了$password之外的内容作为$where的内容,从数据库中搜索记录,如果记录为0,那么当然不用说了,验证失败,但是存在该记录时,就需要去匹配$password是否正确。

laravel保存$password的方式是使用PHP的函数password_hash,该函数能计算传入值的哈希值,而且该函数需要第二个参数,指定哈希处理的方式,Laravel中该参数名为PASSWORD_BCRYPT,Laravel会将密码经过该函数处理后再保存。(至于如何做到的,暂时没有机会深究。)

假设你的密码为123456,那么你保存在数据库中的值就是

password_hash('123456','PASSWORD_BCRYPT')

Auth::attempt()会将你提交过来的值,做password_hash($post_password,'PASSWORD_BCRYPT')处理,然后跟数据库中的存储值进行比较,相等则验证通过,不相等,则自然验证失败。

验证通过后,使用Auth::login(Auth::user());就可以完成用户的登录验证了。

这里再穿插一个知识点,当你使用Eloquent作为数据库驱动时,你需要新建一个用户类,User.php,你可以使用命令行来新建该模型,也可以直接手动新建,但是注意,命令行新建的该模型是存在问题的,Auth::attempt()中会去尝试调用该模型,但是其中调用的类类型不是Model!!!所以你自以为新建好了User.php后,发现会报以下错误:

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

简单来说就是你传递的参数错误了,以下是错误演示:

namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
}

你只要把User.php模型修改成下面的形式就对了:

<?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;
  // 这个参数是关于软删除的,如果你有软删除需要,那么你可以加上
  // use SoftDeletes;
}

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php 中include()与require()的对比
Oct 09 PHP
精美漂亮的php分页类代码
Apr 02 PHP
php堆排序(heapsort)练习
Nov 13 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
PHP微信支付开发实例
Jun 22 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
php中的explode()函数实例介绍
Jan 18 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
thinkPHP框架RBAC实现原理分析
Feb 01 #PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 #PHP
PHP PDOStatement::fetchAll讲解
Jan 31 #PHP
PHP PDOStatement::fetch讲解
Jan 31 #PHP
PHP PDOStatement::execute讲解
Jan 31 #PHP
PHP PDOStatement::errorInfo讲解
Jan 31 #PHP
PHP PDOStatement::errorCode讲解
Jan 31 #PHP
You might like
PHP常用正则表达式集锦
2014/08/17 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
python中去空格函数的用法
2014/08/21 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
工作中的自我评价如何写好
2013/10/28 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
工程项目建议书范文
2014/03/12 职场文书
党员违纪检讨书
2015/05/05 职场文书
解除合同协议书范本
2016/03/21 职场文书