Auth 认证原理简述
Laravel 的认证是使用 guard
与 provider
配合完成, guard
负责认证的业务逻辑,认证信息的服务端保存等; provider
负责提供认证信息的持久化数据提供。
请求提交给 guard
, guard
从 provider
里取出数据(类似用户名、密码等),验证输入数据与服务器端存储的数据是否吻合。如果提交的数据正确,再做 session 等业务的处理(如有需要)。
认证脚手架
首先我们导入 Laravel 的自带的认证脚手架
php artisan make:auth
执行数据库迁移:
php artisan migrate
修改 Auth 认证的配置文件 config/auth.php
在 gurads 处,添加 admin
guard 用于后台管理员认证
<?php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
在 providers 处添加 admins
provider,使用 Admin
模型
<?php
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
创建后台管理员模型
我们再创建一个 Admin
模型,用于后台管理员登录验证。
php artisan make:model Admin -m
-m 参数会同时生成数据库迁移文件 xxxx_create_admins_table
修改 app/Admin.php
模型文件
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
编辑 xxxx_create_admins_table
文件,后台管理员模型结构与前台用户差不多,去掉 email
字段,name
字段设为 unique
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAdminsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('admins');
}
}
管理员模型填充数据
定义一个数据模型工厂,在 database/factories/ModelFactory.php
中添加如下代码
<?php
$factory->define(App\Admin::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->firstName,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
];
});
使用 Faker
随机填充用户名