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(3)
Oct 09 PHP
function.inc.php超越php
Dec 09 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
Jul 14 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
php缓存技术详细总结
Aug 07 PHP
php中stream(流)的用法
Mar 25 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
ThinkPHP模型详解
Jul 27 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 PHP
Yii框架日志操作图文与实例详解
Sep 09 PHP
PHP7.3.10编译安装教程
Oct 08 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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变量作用域的深入解析
2013/06/03 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
详解Vue如何支持JSX语法
2017/11/10 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
Python中Threading用法详解
2017/12/27 Python
Python常见工厂函数用法示例
2018/03/21 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
茶叶店创业计划书范文
2014/01/19 职场文书
先进集体获奖感言
2014/02/13 职场文书
六查六看自查材料
2014/02/17 职场文书
债务纠纷委托书
2014/08/30 职场文书
质量主管工作职责
2014/09/26 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
中秋节慰问信
2015/02/15 职场文书
房产遗嘱范本
2015/08/06 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
golang的文件创建及读写操作
2022/04/14 Golang