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的access操作类
Apr 09 PHP
php使用GeoIP库实例
Jun 27 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
Apr 26 PHP
PHP时间和日期函数详解
May 08 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 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中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
JavaScript版代码高亮
2006/06/26 Javascript
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python实现方便使用的级联进度信息实例
2015/05/05 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
高中数学教学反思
2014/01/30 职场文书
学生鉴定评语大全
2014/05/05 职场文书
大学生团日活动总结
2015/05/06 职场文书
工商局调档介绍信
2015/10/22 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript