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 相关文章推荐
写一个用户在线显示的程序
Oct 09 PHP
php中支持多种编码的中文字符串截取函数!
Mar 20 PHP
PHP教程 变量定义
Oct 23 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
探讨捕获php错误信息方法的详解
Jun 09 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
Yii2实现log输出到file及database的方法
Nov 12 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
PHP与SQL语句常用大全
Dec 10 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
Oct 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
Symfony生成二维码的方法
2016/02/04 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
jquery随机展示头像代码
2011/12/21 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
Python判断直线和矩形是否相交的方法
2015/07/14 Python
神经网络python源码分享
2017/12/15 Python
浅谈flask源码之请求过程
2018/07/26 Python
py-charm延长试用期限实例
2019/12/22 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
大二法学专业职业生涯规划范文
2014/02/12 职场文书
拓展策划方案
2014/06/03 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书