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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
有关phpmailer的详细介绍及使用方法
Jan 28 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
PHP判断是否有Get参数的方法
May 05 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
php+resumablejs实现的分块上传 断点续传功能示例
Apr 18 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
Oct 04 PHP
PHP实现随机发放扑克牌
Apr 21 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
apache mysql php 源码编译使用方法
2012/05/03 PHP
php数组编码转换示例详解
2014/03/11 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
php中in_array函数用法分析
2014/11/15 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
Node 代理访问的实现
2019/09/19 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python简单实现控制电脑的方法
2018/01/22 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
中秋节超市促销方案
2014/01/30 职场文书
一年级语文教学反思
2014/02/13 职场文书
病媒生物防治方案
2014/05/13 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
单位政审意见范文
2015/06/04 职场文书
68句权威创业名言
2019/08/26 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python