广告位联系
返回顶部
分享到

Laravel框架自定义验证过程的分析

php 来源:脚本之家 作者:转载 发布时间:2019-02-03 14:04:08 人浏览
摘要

本篇文章介绍Laravel框架自定义验证过程的分析。 首先,你需要明白一点,当你开启auth中间件的时候,其实是调用了在app/Http/Kernel.php中的 auth = \Illuminate\Auth\Middleware\Authenticate::class, 但是这里先不用去纠结这个文件,这里直接看开启这个验

本篇文章介绍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;
}
 

 


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • PHP获取系统毫秒数时间方法
    前言 php中获取时间方法是date(),在php中获取时间戳方法有time()、strtotime(); date():date(format, timestamp),format为格式、timestamp为时间戳(可选
  • PHP中的DI依赖注入的详细介绍
    什么是 DI / 依赖注入 依赖注入DI 其实本质上是指对类的依赖通过构造器完成 自动注入 通俗来说,就是你当前操作一个类,但是这个类的某
  • PHP8.1 Fiber交叉执行多任务(附代码)
    拿平时大家写的 for 循环举例。像 go 你可以写两个go每个里面各写一个循环同时输入,你可以看到输出是交替。在过去的php版本中,如果只开
  • PHP8.0的编译安装与使用的介绍
    安装与配置 本次使用的操作系统Ubuntu 18.04.4 LTS 安装 1.准备必要库 1 2 apt-get install -y autoconf libxml2-dev libsqlite3-dev \ libcurl4-openssl-dev libssl-dev l
  • Mac如何编译PHP 8.0 到MxSrvs工具

    Mac如何编译PHP 8.0 到MxSrvs工具
    开始准备工作 下载 PHP 8.0 PHP 官方下载 https://www.php.net/downloads.php 进入到 MxSrvs 的主程序路径下的/Applications/MxSrvs/bin,根据 Mxsrvs 的命名规则,
  • PHP8 中的 JIT的详细介绍

    PHP8 中的 JIT的详细介绍
    PHP 8 的 JIT(Just In Time)编译器将作为扩展集成到 php 中 Opcache 扩展 用于运行时将某些操作码直接转换为从 cpu 指令。 这意味着使用JIT后,
  • PHP8.2不再支持字符串中用${}插入变量了

    PHP8.2不再支持字符串中用${}插入变量了
    PHP 社区 4 月底通过了一项只有一张反对票的提案,提案内容是在即将发布的 PHP 8.2 中,不再支持使用 ${} 在字符串中插入变量的语法(标记
  • PHP8.2两个新的强类型:null和false的详细介绍

    PHP8.2两个新的强类型:null和false的详细介绍
    PHP 从 7.0 开始不断地在完善强类型,我们可以给方法参数、返回值、类属性等声明类型。 强类型可以让代码更加健壮,易于维护,可读性增
  • PHP从txt文件中读取数据的介绍

    PHP从txt文件中读取数据的介绍
    一、打开/关闭文件 1、对文件操作时首先要打开文件,打开文件用 fopen()函数,语法是: fopen(filename,mode,include_path,context); 2、对文件操作
  • PHP中token的生成
    php token的生成 接口特点汇总: 1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效; 2、因为是非开放性的,所以
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计