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 split汉字
Jun 05 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
php中转义mysql语句的实现代码
Jun 24 PHP
php 文章调用类代码
Aug 11 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
php中ob_flush函数和flush函数用法分析
Mar 18 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 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
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
Javascript !!的作用
2008/12/04 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
vue slots 组件的组合/分发实例
2018/09/06 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
python实现斐波那契递归函数的方法
2014/09/08 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
QML用PathView实现轮播图
2020/06/03 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
学生会竞选演讲稿纪检部
2014/08/25 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
学校捐书活动总结
2015/05/08 职场文书
最感人的道歉情书
2015/05/12 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
golang 如何通过反射创建新对象
2021/04/28 Golang