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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
discuz的php防止sql注入函数
Jan 17 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
PHPUnit安装及使用示例
Oct 29 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
PHP之header函数详解
Mar 02 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中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
Opacity.js
2007/01/22 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python实现区域填充的示例代码
2021/02/03 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
产品工艺师的岗位职责
2013/11/15 职场文书
自荐信封面
2013/12/04 职场文书
回门宴父母答谢词
2014/01/26 职场文书
技能比赛获奖感言
2014/02/14 职场文书
烹饪自我鉴定
2014/03/01 职场文书
婚前保证书
2014/04/29 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
JavaScript文档对象模型DOM
2021/11/20 Javascript