且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用Guard的Laravel Passport多重身份验证

更新时间:2023-12-02 16:32:34

我设法使用一个简单的中间件创建了多个auth(使用laravel/passport).

I managed to create multiple auths (with laravel/passport) by using a simple middlware.

步骤1:config/auth.php

将您的用户类别添加到提供商

Add your user classes to providers

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'basic_users', // default
    ],        
],

...

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin_users' => [
        'driver' => 'eloquent',
        'model' => App\AdminUser::class,
    ],
    'basic_users' => [
        'driver' => 'eloquent',
        'model' => App\BasicUser::class,
    ],
],

通过CLI清理缓存

php artisan config:cache

第2步:创建中间件

php artisan make:middleware AdminUserProvider

在app/Http/Middleware中打开新创建的中间件,并更新如下所示的hand方法

Open the newly created middleware in app/Http/Middleware and update the hand method like below

public function handle($request, Closure $next)
{
    config(['auth.guards.api.provider' => 'admin_users']);
    return $next($request);
}

第3步:注册您的中间件

将新创建的中间件添加到$ routeMiddleware

Add the newly created middleware to $routeMiddleware

protected $routeMiddleware = [
    ...
    'auth.admin' => \App\Http\Middleware\AdminUserProvider::class,
];

并确保它位于$ middlewarePriority的顶部

and make sure it's at the top of $middlewarePriority

protected $middlewarePriority = [
    \App\Http\Middleware\AdminUserProvider::class,
    ...
];

第4步:添加要路由的中间件

Route::group(['middleware' => ['auth.admin','auth:api']], function() {

步骤5:LoginControllers(AdminUserController和BasicUserController)

public function login()
{
    $validatedData = request()->validate([
        'email' => 'required',
        'password' => 'required|min:6'
    ]);
    // get user object
    $user = AdminUser::where('email', request()->email)->first();
    // do the passwords match?
    if (!Hash::check(request()->password, $user->password)) {
        // no they don't
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    // log the user in (needed for future requests)
    Auth::login($user);
    // get new token
    $tokenResult = $user->createToken($this->tokenName);
    // return token in json response
    return response()->json(['success' => ['token' => $tokenResult->accessToken]], 200);
}

总结:

登录控制器使用Eloquent模型获取用户对象,然后通过Auth :: login($ user)登录用户

The login controllers use Eloquent models to get the user object and then log the user in through Auth::login($user)

然后,对于将来需要身份验证的请求,新的中间件会将api auth Guard提供程序更改为正确的类.

Then for future requests that need authentication, the new middleware will change the api auth guard provider to the correct class.