多用户认证功能实现详解


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

1、生成认证脚手架

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

  1. php artisan make:auth

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

2016-02-20_101608

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

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

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

2、实现前台用户登录

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

  1. php artisan migrate

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

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

Laravel 5.2用户注册

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

Laravel 5.2 用户认证

3、编辑认证配置文件

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

  1. <?php
  2.  
  3. return [
  4.  
  5. 'defaults' => [
  6. 'guard' => 'web',
  7. 'passwords' => 'users',
  8. ],
  9.  
  10. 'guards' => [
  11. 'web' => [
  12. 'driver' => 'session',
  13. 'provider' => 'users',
  14. ],
  15. 'admin' => [
  16. 'driver' => 'session',
  17. 'provider' => 'admins',
  18. ],
  19. 'api' => [
  20. 'driver' => 'token',
  21. 'provider' => 'users',
  22. ],
  23. ],
  24.  
  25. 'providers' => [
  26. 'users' => [
  27. 'driver' => 'eloquent',
  28. 'model' => App\User::class,
  29. ],
  30. 'admins' => [
  31. 'driver' => 'eloquent',
  32. 'model' => App\Admin::class,
  33. ],
  34. ],
  35.  
  36. 'passwords' => [
  37. 'users' => [
  38. 'provider' => 'users',
  39. 'email' => 'auth.emails.password',
  40. 'table' => 'password_resets',
  41. 'expire' => 60,
  42. ],
  43. ],
  44. ];

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

4、创建后台用户模型

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

  1. php artisan make:model Admin --migration

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

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

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

  1. php artisan migrate

然后更新Admin模型类如下:

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Foundation\Auth\User as Authenticatable;
  6.  
  7. class Admin extends Authenticatable
  8. {
  9. /**
  10. * The attributes that are mass assignable.
  11. *
  12. * @var array
  13. */
  14. protected $fillable = [
  15. 'name', 'email', 'password',
  16. ];
  17.  
  18. /**
  19. * The attributes excluded from the model's JSON form.
  20. *
  21. * @var array
  22. */
  23. protected $hidden = [
  24. 'password', 'remember_token',
  25. ];
  26. }

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

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

  1. Route::group(['middleware' => ['web']], function () {
  2.  
  3. Route::auth();
  4. Route::get('home', 'HomeController@index');
  5.  
  6. Route::get('admin/login', 'Admin\AuthController@getLogin');
  7. Route::post('admin/login', 'Admin\AuthController@postLogin');
  8. Route::get('admin/register', 'Admin\AuthController@getRegister');
  9. Route::post('admin/register', 'Admin\AuthController@postRegister');
  10. Route::get('admin', 'AdminController@index');
  11.  
  12. });

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

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

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

  1. <?php
  2.  
  3. namespace App\Http\Controllers\Admin;
  4.  
  5. use App\Admin;
  6. use Validator;
  7. use App\Http\Controllers\Controller;
  8. use Illuminate\Foundation\Auth\ThrottlesLogins;
  9. use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
  10.  
  11. class AuthController extends Controller
  12. {
  13. use AuthenticatesAndRegistersUsers, ThrottlesLogins;
  14.  
  15. protected $redirectTo = '/admin';
  16. protected $guard = 'admin';
  17. protected $loginView = 'admin.login';
  18. protected $registerView = 'admin.register';
  19.  
  20. public function __construct()
  21. {
  22. $this->middleware('guest:admin', ['except' => 'logout']);
  23. }
  24.  
  25. protected function validator(array $data)
  26. {
  27.  
  28. return Validator::make($data, [
  29. 'name' => 'required|max:255',
  30. 'email' => 'required|email|max:255|unique:admins',
  31. 'password' => 'required|confirmed|min:6',
  32. ]);
  33.  
  34. }
  35.  
  36. protected function create(array $data)
  37. {
  38. return Admin::create([
  39. 'name' => $data['name'],
  40. 'email' => $data['email'],
  41. 'password' => bcrypt($data['password']),
  42. ]);
  43.  
  44. }
  45.  
  46. }

编辑AdminController.php代码如下:

  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use Illuminate\Http\Request;
  6.  
  7. use App\Http\Requests;
  8. use App\Http\Controllers\Controller;
  9. use Auth;
  10.  
  11. class AdminController extends Controller
  12. {
  13.  
  14. public function __construct()
  15. {
  16. $this->middleware('auth:admin');
  17. }
  18.  
  19. public function index()
  20. {
  21. $admin = Auth::guard('admin')->user();
  22. return $admin->name;
  23. }
  24.  
  25. }

6、视图文件创建及修改

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

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

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

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

7、实现后台用户认证

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

Laravel 5.2 用户注册

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

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