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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
PHP6 先修班 JSON实例代码
Aug 23 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
使用php伪造referer的方法 利用referer防止图片盗链
Jan 20 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 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读注册表
2006/10/09 PHP
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
javascript常用的方法分享
2015/07/01 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
如何快速上手Vuex
2017/02/14 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
Python爬取京东的商品分类与链接
2016/08/26 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
python爬虫 urllib模块反爬虫机制UA详解
2019/08/20 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
python圣诞树编写实例详解
2020/02/13 Python
python实现飞机大战项目
2020/03/11 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
企业项目策划书
2014/01/11 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
八年级数学教学反思
2016/02/17 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS