6

Lumen フレームワークに複数の認証ガードを実装する方法を誰か説明できますか? 現在、 UsersClientsの 2 つの認証可能なモデルがあります。JWT のカスタム実装を使用しています。ユーザーのトークン ペイロードにはフィールドclient_idとフィールドがあります。user_idクライアントはclient_id. これに基づいて、誰が私のところに来たのかを判断する必要があります: クライアント、ユーザー、またはゲスト (トークンなし)。

auth.php

'guards' => [
    'client' => [
        'driver' => 'token',
        'provider' => 'clients',
    ],
    'user' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

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

AuthServiceProvider.php

public function boot()
{
    $this->app['auth']->viaRequest('token', function ($request) {
        $access_token = HelperClass::getTokenFromHeader($request->headers->get('Authorization'));

        if ($access_token) {
            $tokendata = JWT::decode($access_token, getenv('TOKEN_SECRET'), array('HS256'));

            if ($tokendata->user_id) {
                return User::find($tokendata->user_id);
            }

            return Client::find($tokendata->client_id);
        }
    });
}

ルート.php

$app->get('/api/{item_id:\d+}', ['middleware' => 'auth:user', 'uses' => 'App\Http\Controllers\ItemController@get']);

このルートへのアクセスをユーザーのみに許可したいのですが、クライアントもこのミドルウェアを正常に通過します: App\Client のインスタンスを返しAuth::check()true返しますAuth::user()

別の状況: 一部のルートで、クライアントとユーザーの両方を許可したい場合。別のルート - ゲスト、クライアント、およびユーザー。

4

0 に答える 0