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
门面,自己实现过程。
最后说一句
如果还有不懂的朋友可以评论区问,我基本每天来,我尽力解答。