laravel 5.2 中自带的用户认证服务可以说是很好的一项服务,开箱执行个php artisan make:auth 命令,改下视图就可以实现网站用户登录,注册功能了;真是轻松便捷。

那么问题来了:

  • 如何前后端分离认证?

  • 如果表结构与laravel开箱的users表结构不一样呢,该怎么样?

其实上面的问题在laravel学院文档 手动认证用户 已经有说明了,只是例子比较少所以初学者有点难理解;因为最近看了auth部分源码,所以这里写篇文章解决下这些问题。

Auth方法

首先 laravel auth 用户认证都是通过 Auth门面 实现的,需要了解的可以自行查看源码;

那么解决上面问题的方法是什么呢?

那就是手动认证用户?

手动认证可以使用 Auth::attempt 或者 Auth::login 方法。

Auth::attempt:

Auth::guard('看守')->attempt($credentials);//尝试认证一个用户,返回bool值

Auth::guard('看守') 是设置看守。

看守的意思就类似于门口的门卫,当然如果不设置的话laravel默认会使用web看守。

$credentials 是请求的数据,类似于:

$credentials = [
    'name' => 'test',
    'password' => '123456',
];

Auth::login

Auth::guard('看守')->login($model);//认证$model实例,没有返回值

$model是一个模型数据

admin认证例子

有了上面连个方法就可以做用户认证操作了。

创建数据表

创建模型 Admin :

php artisan make:model Admin -m

-m 参数表示生成数据库迁移

命令会在 database/migrations 目录生成迁移 2016_12_06_120056_create_admins_table.php,并在 app 目录生成模型文件 Admin.php

编写迁移 2016_12_06_120056_create_admins_table.php 中up方法:

public function up()
{
    Schema::create('admins', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name',15)->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

编写模型Admin.php信息:

<?php

namespace App;
//use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
//class Admin extends Model
//采用Auth::attempt接口认证用户,用户模型必须继承Authenticatable
class Admin extends Authenticatable
{
     protected $fillable = [
        'name', 'password',
    ];

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

这里值得注意的是Admin 模型集成的是 Authenticatable ,应为 Auth 门面的原因。

执行迁移创建数据表:

php artisan migrate

定义看守

定义看守需要在 config/auth.php 文件中定义;
guards 中增加 admin 看守:

//定义看守
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

声明 admins 提供者:

//声明提供者
'providers' => [
    'users' => [
        'driver' => 'eloquent',//eloquent or database
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',//eloquent or database
        'model' => App\Admin::class,
    ],
],

保存文件。

编写路由和测试代码

为了方便,这里就不再建立视图了,直接在 routes.php 调试。

routes.php 文件编写代码:

Route::get('admin/register',function(){
    $admin = Admin::create([
        'name' => 'test5',
        'password' => bcrypt('123456'),
    ]);
    Auth::guard('admin')->login($admin);
    return redirect('admin/success');
});
Route::get('admin/login',function(){
    $credentials = [
        'name' => 'test1',
        'password' => '123456',
    ];
    $bool = Auth::guard('admin')->attempt($credentials);

    if($bool){
        return redirect('admin/success');
    }else{
        dump('登录失败');
    }
});
Route::get('admin/success',function(){
    dump(Auth::guard('admin')->user());
    dump(session()->all());
});
Route::get('admin/logout',function(){
    Auth::guard('admin')->logout();
    dump(Auth::guard('admin')->user());
    dump(session()->all());
});
  • admin/register 注册

  • admin/login 登录

  • admin/success 登录、注册成功跳转

  • admin/logout 注销

访问 admin/register 注册:

注册并登录成功。

访问 admin/login 登录:

访问 admin/logout 注销:

总结

如果你的表结构与laravel默认的users表结构一样,那么用户认证是很容易的。
如果表结构与laravel默认的users表结构不一样,那么你就需要采用 Auth 门面的方法自己重新编写控制器;当然你也可以完全丢掉Auth 门面,自己实现过程。

最后说一句

如果还有不懂的朋友可以评论区问,我基本每天来,我尽力解答。

03-05 21:38