Laravel 登录验证,md5验证,自定义验证,自定义表

Laravel 登录验证默认是用user模型,这个模型默认在app目录下User.php,如果用默认的模型,数据库必须要有user表,而且还要有相应的字段。看一下这个模型,这是Laravel默认的User

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
 

一:自定义模型表。

1:假设登录数据表是admin。这里修改config目录下的auth.php

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],


        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
        'admin' =>[
            'driver' => 'session',
            'provider' => 'admins',
        ],

    ],


'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admins' =>[
            'driver' =>'eloquent',
            'model' => Models\Admin::class, //模型的位置,这里我放在Models目录,laravel默认在app目录下,你可以放在任何目录
        ],

注意:红色部分是我们新加的

2:建立Admin模型

<?php
namespace Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable //必须继承这个契约
{
	use Notifiable;

    protected $table = 'admin'; //表
     
    protected $primaryKey = 'id'; //主键

    public $timestamps = false;

    protected $fillable = [
        'username', 'password',
    ];

   
    protected $hidden = [
        'password',
    ];
}
 这个模型我们直接复制修改laravel默认的User.php模型即可。 注意这里:class User extends Authenticatable,一定要extends Authenticatable


3:控制器调用认证

 //调用admin,我们在config/auth.php里的guards,新加的admin,上面第一步
 Auth::guard('admin')->attempt(['username' => $username, 'password' => $password]]); 
 //Laravel默认调用user
 Auth::attempt(['username' => $username, 'password' => $password]]); 

 

这里有一个问题,laravel验证用的是hash,以前很多项目都是MD5,怎么改?

网上普遍实现的一种方法是修改了laravel源码,我们尽量不动它的源码,我们可以用一种更加简单的方法实现,验证我们自己写,验证完以后通过laravel去认证即可。

首先接受到用户提交的数据后,对比用户名和密码是否正确。如果正确获取用户ID,然后通过 loginUsingId 方法认证即可。

Auth::guard('admin')->loginUsingId(4); //默认是user模型,我这里自定义admin模型,假设用户ID为4

loginUsingId 方法还有个设置,loginUsingId登录并 "记住" 给定用户,此时:

Auth::guard('admin')->loginUsingId(4,true);
注意: 如果加true,此时laravel会做一个update表的操作,laravel会在模型表中加入一串token,字段为:remember_token,默认的user有这个字段,但自己定义的表需要添加这个字段,当然你也可以指定其他字段。在模型表添加即可,我这里在Admin中添加,在上面第2部Admin模型中添加如下方法。

 public function getRememberTokenName()
    {
        return 'token';//自定义token字段
    }

loginUsingId之后,用户就可以登录了,还需注意中间件的问题,如果我们中间件用的是laravel默认的auth,模型表也是laravel默认的。路由中间件写法

//认证后才可以访问
Route::group(['prefix'=>'admin','namespace'=>'Admin','middleware'=>'auth'],function(){
Route::get('/main','MainController@index');
});

如果模型不是user是我们自己定义的,比如我这里是admin,那么应该这样写:

//认证后才可以访问
Route::group(['prefix'=>'admin','namespace'=>'Admin','middleware'=>'auth:admin'],function(){
Route::get('/main','MainController@index');
});

如果没有这一步,自定义Guards不会通过,明明已经登录,但其他页面还是会显示没登录状态。

查看完整原文文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值