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 門面,本身實現過程。

最後說一句

若是還有不懂的朋友能夠評論區問,我基本天天來,我盡力解答。

相關文章
相關標籤/搜索