В Laravel 5.7, как переопределить промежуточное ПО Tymon Jwt-Auth в ядре?

Я использую Laravel 5.7 для некоторого api. Я также использую пакет https://github.com/tymondesigns/jwt-auth для генерировать токены JWT для аутентификации пользователей. Давно все настроил и работает хорошо.

Регистрирую группу Route в RouteServiceProvider.php под routes/api_v1.php:

Route::prefix('api/v1')
     ->middleware('api')
     ->namespace($this->namespace.'\API\V1')
     ->group(base_path('routes/api_v1.php'));

В config.auth.php у меня есть api_v1 guard с драйвером jwt:

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

    'api_v1' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

Я сделал App/User.php реализовал Tymon\JWTAuth\Contracts\JWTSubject и реализовал 2 метода.

Но когда в app/Http/Kernel.php я добавил в массив промежуточного программного обеспечения:

protected $routeMiddleware = [
    // previous middlewares,
    'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class
];

Маршруты в routes/api_v1.php в группе jwt.auth:

Route :: middleware (['jwt.auth']) -> group (function () {

// Keep auto resource route at bottom to prevent route conflict with Show parameter route
foreach(Controller::$resourceModels as $key => $model) {
    //Route::post($key.'/{id}/patch', $model.'Controller@patchUpdate');
    Route::resource($key, $model.'Controller');
}

});

никогда не достигайте промежуточного программного обеспечения App\Http\Middleware\JWTAuthenticate::class, но всегда переходите к исходному промежуточному программному обеспечению пакета tymon Tymon\JWTAuth\Http\Middleware\Authenticate::class.

Даже если я не помещаю драйвер api в jwt в auth.php config и не помещаю jwt.auth класс в промежуточное ПО, он нормально работает с исходным промежуточным ПО.

Мне нужно, чтобы группа Routes перешла к моему собственному классу промежуточного программного обеспечения App/Http/Middlewares/JWTAuthenticate:

<?php

namespace App\Http\Middleware;

use Tymon\JWTAuth\Http\Middleware\Authenticate;

use Closure;

class JWTAuthenticate extends Authenticate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     *
     * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // My own logics here
        // ...


        $this->authenticate($request);

        return $next($request);
    }
}

и таким образом я могу переопределить handle метод и сначала проверить свои собственные вещи.


person KeitelDOG    schedule 23.03.2019    source источник


Ответы (2)


Я могу сказать вам, почему это происходит.

Файл app\Http\Kernel.php с конфигурацией промежуточного программного обеспечения вызывается до регистрации поставщиков услуг.

Поэтому после этого вызывается поставщик услуг Tymon JWT и устанавливает псевдонимы промежуточного программного обеспечения для:

  • 'jwt.auth' => Tymon \ JWTAuth \ Http \ Middleware \ Authenticate :: class,
  • 'jwt.check' => Tymon \ JWTAuth \ Http \ Middleware \ Check :: class,
  • 'jwt.refresh' => Tymon \ JWTAuth \ Http \ Middleware \ RefreshToken :: class,
  • 'jwt.renew' => Tymon \ JWTAuth \ Http \ Middleware \ AuthenticateAndRenew :: class,

таким образом переопределив ваш ключ.

Таким образом, использование другого ключа промежуточного программного обеспечения является правильным способом использования вашей собственной реализации.

person Flame    schedule 23.03.2019
comment
Я уже заставил это работать, но так как я не понял, почему я думаю, что ваш ответ более актуален для других. Спасибо. - person KeitelDOG; 23.03.2019

Я переименовал группу маршрутов промежуточного ПО и изменил

Route::middleware(['jwt.auth'])->group(function() {

to

Route::middleware(['jwt.authenticate'])->group(function() {

а также

'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class

to

'jwt.authenticate' => \App\Http\Middleware\JWTAuthenticate::class

А оригинальный jwt.auth больше не назывался. Я не знаю почему, но теперь я могу контролировать это в моем промежуточном программном обеспечении.

person KeitelDOG    schedule 23.03.2019