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教程 基本语法
Oct 23 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
PHP关联链接常用代码
Nov 05 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
May 04 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
谈谈 PHP7新增功能
Dec 16 PHP
PHP实现原比例生成缩略图的方法
Feb 03 PHP
php的命名空间与自动加载实现方法
Aug 25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
Laravel相关的一些故障解决
Aug 19 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中取得URL的根域名的代码
2011/03/23 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
css图片自适应大小
2007/11/28 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
小程序实现搜索框
2020/06/19 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
[01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
2018/08/24 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python实现控制COM口的示例
2019/07/03 Python
python实现邮件自动发送
2019/08/10 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
几个MySql的面试题
2013/04/22 面试题
自荐信结尾
2013/10/27 职场文书
大学生社会实践评语
2014/04/25 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
事业单位考察材料范文
2014/12/25 职场文书
公司开除员工通知
2015/04/22 职场文书
政协工作总结2015
2015/05/20 职场文书
2015入党自传格式范文
2015/06/26 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
小学中队长竞选稿
2015/11/20 职场文书
python 实现定时任务的四种方式
2021/04/01 Python