• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Laravel框架自定义验证过程实例分析

    本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

    希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • laravel5.2表单验证,并显示错误信息的实例
    • laravel 验证错误信息到 blade模板的方法
    • Laravel框架表单验证格式化输出的方法
    • Laravel框架验证码类用法实例分析
    • Laravel多域名下字段验证的方法
    • laravel http 自定义公共验证和响应的方法
    上一篇:thinkPHP框架RBAC实现原理分析
    下一篇:PHP-FPM和Nginx的通信机制详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Laravel框架自定义验证过程实例分析 Laravel,框架,自定义,验证,