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编程最快明白》第八讲:php启发和小结
Nov 01 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 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
中国第一家无线电行
2021/03/01 无线电
php中实现记住密码自动登录的代码
2011/03/02 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
javascript 写类方式之七
2009/07/05 Javascript
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python中日志logging模块的性能及多进程详解
2017/07/18 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
人机交互程序 python实现人机对话
2017/11/14 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
用Python解决x的n次方问题
2019/02/08 Python
详解Python循环作用域与闭包
2019/03/21 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
python 定时器每天就执行一次的实现代码
2019/08/14 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
安踏广告词改编版
2014/03/21 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
校园安全广播稿范文
2014/09/25 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书