laravel 5.2 中自帶的用戶認證服務能夠說是很好的一項服務,開箱執行個php artisan make:auth
命令,改下視圖就能夠實現網站用戶登陸,註冊功能了;真是輕鬆便捷。php
那麼問題來了:html
如何先後端分離認證?laravel
若是表結構與laravel開箱的users
表結構不同呢,該怎麼樣?web
其實上面的問題在laravel學院文檔 手動認證用戶 已經有說明了,只是例子比較少因此初學者有點難理解;由於最近看了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
:
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
門面,本身實現過程。
若是還有不懂的朋友能夠評論區問,我基本天天來,我盡力解答。