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
门面,本身实现过程。
若是还有不懂的朋友能够评论区问,我基本天天来,我尽力解答。