laravel 5.2 先后端用户认证方案

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

那么问题来了:html

  • 如何先后端分离认证?laravel

  • 若是表结构与laravel开箱的users表结构不同呢,该怎么样?web

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

Auth方法

首先 laravel auth 用户认证都是经过 Auth门面 实现的,须要了解的能够自行查看源码;后端

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

那就是手动认证用户?session

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

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 注册:

clipboard.png

注册并登陆成功。

访问 admin/login 登陆:

clipboard.png

访问 admin/logout 注销:

clipboard.png

总结

若是你的表结构与laravel默认的users表结构同样,那么用户认证是很容易的。
若是表结构与laravel默认的users表结构不同,那么你就须要采用 Auth 门面的方法本身从新编写控制器;固然你也能够彻底丢掉Auth 门面,本身实现过程。

最后说一句

若是还有不懂的朋友能够评论区问,我基本天天来,我尽力解答。

相关文章
相关标签/搜索