Laravel框架自定义验证过程实例分析
本文实例讲述了Laravel框架自定义验证过程。分享给大家供大家参考,具体如下:
首先,你需要明白一点,当你开启auth中间件的时候,其实是调用了在app/Http/Kernel.php中的
'auth' = IlluminateAuthMiddlewareAuthenticate::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 IlluminateAuthEloquentUserProvider::validateCredentials() must be an instance of IlluminateContractsAuthAuthenticatable, instance of AppUser given, called in /var/www/sample/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php on line 379 and defined
简单来说就是你传递的参数错误了,以下是错误演示:
namespace AppModel;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
}
你只要把User.php模型修改成下面的形式就对了:
<?php
namespace App;
use IlluminateAuthAuthenticatable;
use IlluminateDatabaseEloquentModel;
use IlluminateAuthPasswordsCanResetPassword;
use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract;
use IlluminateDatabaseEloquentSoftDeletes;
class User extends Model implements AuthenticatableContract
{
use Authenticatable, CanResetPassword;
// 这个参数是关于软删除的,如果你有软删除需要,那么你可以加上
// use SoftDeletes;
}
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Java——数据库编程JDBC之快速入门吐血总结及各关键对象详解(提供了JDBCUtils工具类)
- MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结
- MySQL数据库——数据库的设计(多表之间的关系与三大范式)与备份还原
- JavaWeb——JSP入门学习(JSP基本概念、JSP脚本、JSP内置对象)
- MySQL数据库——数据库CRUD之基本DML增删改表操作及DQL查表操作
- JavaWeb——AJAX异步技术实现方式与案例实战(原生的JS方式、使用JQuery方式)
- JavaWeb——一文带你入门Servlet(生命周期、注解配置方法、IDEA与tomcat的相关配置)
- JavaWeb——JQuery之基础案例实战(实现表格隔行换色、实现全选全不选、QQ表情选择、下拉列表选中条目左右选择功能)
- JavaWeb——JQuery之DOM操作应用及实践案例总结(DOM内容操作、DOM属性操作、CRUD操作)
- JavaWeb——Filter过滤器快速入门与是否登录验证&过滤敏感词汇案例实战(Filter配置方式、执行流程、生命周期方法、过滤器链)
- JavaWeb——会话技术之Session快速入门与验证码登录案例实战(Session实现原理、使用细节、快速入门、Session的特点)
- Nginx配置文件服务器
- JavaWeb——会话技术之Cookie快速入门与案例实战(详细讲解了Cookie实现原理、Cookie使用细节、Cookie的特点及作用)
- docker安装kibana
- JavaWeb——ServletContext对象的使用及文件下载案例实战