Lumen 框架默认只有一种角色认证(单表),但是通常我们会把后台管理员与前台用户设计成两个不同的表,这个时候就得改造一下代码了。

假设后台管理员和前台用户对应 Model 分别为 App\Models\AdminApp\Models\User,作如下修改:

1、修改 bootstrap/app.php

启用 Facade,拿掉 Authenticate 中间件和 AuthServiceProvider 服务提供者的代码注释:

// 启用 Facade
$app->withFacades();

// ...无关代码略...

$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
]);

// ...无关代码略...

$app->register(App\Providers\AuthServiceProvider::class);

2、添加配置文件 config/auth.php

定义两个 guard,一个用于前台,一个用于后台,默认前台。内容如下:

<?php

return [
    'defaults' => [
        'guard' => 'user',
    ],
    'guards' => [
        'user' => [
            'driver' => 'user',
        ],
        'admin' => [
            'driver' => 'admin',
        ]
    ]
];

3、修改 app/Http/Middleware/Authenticate.php

在头部引入两个 Model,然后修改它的 boot 方法,实现两个 guard 的认证方式:

<?php

namespace App\Providers;

use App\Models\User;
use App\Models\Admin;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{

    public function register()
    {

    }

    public function boot()
    {
        // 示例:验证成功返回 User 模型实例
        $this->app['auth']->viaRequest('user', function ($request) {
            $token = $request->header('user-token');
            if ($token) {
                return User::where('token', $token)->first();
            }
        });

        // 示例:验证成功返回 Admin 模型实例
        $this->app['auth']->viaRequest('admin', function ($request) {
            $token = $request->header('admin-token');
            if ($token) {
                return Admin::where('token', $token)->first();
            }
        });
    }

}

4、在路由 routes/web.php 中使用中间件

// 前台认证的中间件写 auth 或 auth:user 都可以
$router->get('user/profile', ['middleware' => 'auth', function () {
    //
}]);

// 后台认证的中间件要写完整 auth:admin
$router->get('admin/profile', ['middleware' => 'auth:admin', function () {
    //
}]);

5、获取已认证的用户实例

先在类文件头部引入认证的 Facade:use Illuminate\Support\Facades\Auth,然后,如果是获取已认证的前台用户实例直接用 Auth::user() 就可以,如果是获取后台已认证的用户实例,要指定 guard,即:Auth::guard('admin')->user()