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捕获Fatal error错误的方法
Jun 11 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
Oct 08 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
php实现微信分享朋友链接功能
Feb 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获取MAC地址的函数代码
2011/09/11 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
php实现评论回复删除功能
2017/05/23 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
表单提交验证类
2006/07/14 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
使用Python对Csv文件操作实例代码
2017/05/12 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
区分python中的进程与线程
2020/08/13 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
初中数学教学反思
2014/01/16 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
《我的信念》教学反思
2014/02/15 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
体育活动总结范文
2014/05/04 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
创优争先心得体会
2014/09/11 职场文书
Android中的Launch Mode详情
2022/06/05 Java/Android