多用户认证功能实现详解

Laravel 5.2新增多用户认证支持,即同时允许不同数据表用户(如前台用户、后台用户)登录认证。下面我们就来简单介绍多用户登录及注册功能实现。

1、生成认证脚手架

首先我们使用Laravel 5.2提供的认证脚手架完成初始化工作:

php artisan make:auth

该Artisan命令会生成用户认证所需的路由、视图以及HomeController:

去查看路由文件routes.php,会发现该文件已经被更新:

1
2
3
4
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/home', 'HomeController@index');
});

其中 Route::auth() 定义了注册登录路由, /home 为认证通过后跳转路由。

2、实现前台用户登录

接下来我们先实现前台用户登录,也就是Laravel自带的User用户登录。通过上面的脚手架,我们已经生成了认证所需的所有代码,剩下要做的就是使用迁移命令创建用户认证相关表:

php artisan migrate

该命令执行后生成 users 表和 password_resets 表,分别为用户主表和密码重置表。

然后我们就可以在浏览器中输入 http://laravel.app/register 来注册新用户:

我们创建一个用户名为 test 的用户,注册成功后,进入 http://laravel.app/home ,会发现已经登录:

3、编辑认证配置文件

要实现多用户认证,首先要配置认证配置文件 auth.php ,这里我们实现的功能是前后台用户登录,所以对应配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php

return [

'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],

'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],

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

'passwords' => [
'users' => [
'provider' => 'users',
'email' => 'auth.emails.password',
'table' => 'password_resets',
'expire' => 60,
],
],
];

认证是由 guard 和 provider 两部分构成的(参考用户认证文档),所以我们在这两个配置项中分别新增了 admin 和 admins 选项。

4、创建后台用户模型

接下来我们来实现后台用户登录,首先使用如下Artisan命令生成后台用户模型:

php artisan make:model Admin --migration

带上 --migration 选项会生成对应用户表 admins ,我们定义该数据表字段和 users 一样:

1
2
3
4
5
6
7
8
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});

然后通过运行迁移命令生成该表:

php artisan migrate

然后更新 Admin 模型类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];

/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}

5、定义后台用户认证路由及控制器

接下来我们来定义后台用户认证路由,修改 routes.php 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
Route::group(['middleware' => ['web']], function () {

Route::auth();
Route::get('home', 'HomeController@index');

Route::get('admin/login', 'Admin\AuthController@getLogin');
Route::post('admin/login', 'Admin\AuthController@postLogin');
Route::get('admin/register', 'Admin\AuthController@getRegister');
Route::post('admin/register', 'Admin\AuthController@postRegister');
Route::get('admin', 'AdminController@index');

});

然后使用Artisan命令创建对应控制器:

1
2
php artisan make:controller Admin/AuthController
php artisan make:controller AdminController

编辑 Admin/AuthController.php 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php

namespace App\Http\Controllers\Admin;

use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;

protected $redirectTo = '/admin';
protected $guard = 'admin';
protected $loginView = 'admin.login';
protected $registerView = 'admin.register';

public function __construct()
{
$this->middleware('guest:admin', ['except' => 'logout']);
}

protected function validator(array $data)
{

return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:admins',
'password' => 'required|confirmed|min:6',
]);

}

protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);

}

}

编辑 AdminController.php 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Auth;

class AdminController extends Controller
{

public function __construct()
{
$this->middleware('auth:admin');
}

public function index()
{
$admin = Auth::guard('admin')->user();
return $admin->name;
}

}

6、视图文件创建及修改

最后我们要创建后台用户认证对应视图文件,这里我们简单拷贝前台用户视图模板并稍作修改即可:

cp -r resources/views/auth resources/views/admin

修改 resources/views/admin 目录下登录及注册表单提交地址:

1
2
/login -> /admin/login
/register -> /admin/register

7、实现后台用户认证

在浏览器中访问 http://laravel.app/admin/register ,同样显示注册页面:

注册一个用户名为 admin 的用户,注册成功后,页面跳转到 http://laravel.app/admin ,说明认证成功。

好了,至此我们已经完成前后台用户同时登录认证功能。