本文实例讲述了Laravel框架自定义验证过程。分享给大家供大家参考,具体如下:
首先,你需要明白一点,当你开启auth中间件的时候,其实是调用了在app/Http/Kernel.php中的
代码语言:javascript复制'auth' = IlluminateAuthMiddlewareAuthenticate::class,
但是这里先不用去纠结这个文件,这里直接看开启这个验证之后会怎样。首先,如果你去访问开启这个验证的控制器,但是你又没有登录的话,那么会默认去搜索login路由,所以你需要在路由中设置该路由:
代码语言:javascript复制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,那么你保存在数据库中的值就是
代码语言:javascript复制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
简单来说就是你传递的参数错误了,以下是错误演示:
代码语言:javascript复制namespace AppModel;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
}
你只要把User.php模型修改成下面的形式就对了:
代码语言:javascript复制<?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;
}