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学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP使用SOAP调用.net的WebService数据
Nov 12 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
Yii2框架使用计划任务的方法
May 25 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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通用防注入程序 推荐
2011/02/26 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
js实现简单的验证码
2015/12/25 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
js实现表格数据搜索
2020/08/09 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
Python中sort和sorted函数代码解析
2018/01/25 Python
详解Python中如何写控制台进度条的整理
2018/03/07 Python
Python实现ping指定IP的示例
2018/06/04 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
python 阶乘累加和的实例
2019/02/01 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
小学生安全演讲稿
2014/04/25 职场文书
营销总监岗位职责
2014/09/16 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书