Laravel中使用guard进行前后台用户分离

创建于 11个月前 / 阅读数 219 / PHP


在 Laravel 项目中,默认为我们生成了 users 表的 migration 文件,我们可以通过 make:auth 命令快速完成前台用户的登录注册,邮箱认证,密码找回等功能。

对于后台管理员,虽然我们也可以使用 users 表通过添加字段或者引用 laravel-permission 这样的包按角色进行管理,但有些时候业务逻辑需要我们将管理员用户单独抽离出来,此时可以使用 guard 进行划分。

需求

用于将前后台用户分离

目标

  • 前台 - user 表
  • 后台 - admin 表

实现

Model & Migration

创建 admins 表与模型

$ php artisan make:model Admin -m

说明:-m 表示同时创建 migration 文件

设置批量赋值
app / Admin.php

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
    protected $fillable = [
        'name', 'email', 'password'
    ];
}

说明:后续使用自定义看守器的验证,这里需要继承 Authenticatable

看守器

config / auth.php

'guards' => [
    ...
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ]
];

'providers' => [
    ...
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
];

测试数据

$ php artisan tinker
>>> namespace App;
>>> Admin::create(['name' => 'Selslim', 'email' => '17149103@qq.com', 'password' => bcrypt('123456')]);

控制器

创建

$ php artisan make:controller AdminController

app / Http / Controllers / AdminController.php

use Auth;

public function create()
{
    return view('admins.create');
}

public function store(Request $request)
{
    $credentials = [
        'email' => $request -> email,
        'password' => $request -> password
    ];
    if (Auth::guard('admin') -> attempt($credentials)) {
        return redirect() -> route('admin.test');
    }
    ...
}

public function test()
{
    $admin = Auth::guard('admin') -> user();
    dump($admin);
}

路由

Route::get('test', 'AdminController@test') -> name('admin.test');
Route::resource('admin', 'AdminController', [
    'only' => ['create', 'store']
]);

说明:test 用于展示登录结果

模版

resources / views / admins / create.blade.php

<form action="{{ route('admin.store') }}" method="POST">

    {{ csrf_field() }}

    <p><input type="text" name="email" placeholder="请输入邮箱"></p>
    <p><input type="password" name="password" placeholder="请输入密码"></p>
    <p><button type="submit">登录</button></p>
</form>

说明:登录成功将跳转至 /test