JWT Auth не работает, когда метод __construct в контроллере - PullRequest
1 голос
/ 04 мая 2020

В приложении Laravel промежуточное ПО JWT не работает должным образом. Я обнаружил, что нет проверки подлинности, когда у контроллера есть метод __construct.

class ProjectController extends Controller
{
    public $company;

    public $user;

    public function __construct(Request $request)
    {

        $this->company = $request->user()->company;

        $this->user = $request->user();
    }

Маршруты Api:

Route::group(['middleware' => 'jwt.auth'], function () {
    Route::resource('/projects', 'Project\\ProjectController');
});

Когда я комментирую метод __construct система вернет 401, как и ожидалось. Но если метод __construct не комментируется, система возвращает 500, потому что компания не может быть найдена.

Почему метод __construct не работает с jwt?

1 Ответ

0 голосов
/ 04 мая 2020

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

Laravel собирает все Маршрут определяет c промежуточное программное обеспечение, прежде чем выполнить запрос через конвейер, и во время сбора промежуточного программного обеспечения контроллера создается экземпляр контроллера, поэтому вызывается конструктор, однако на данный момент запрос еще не готов.

Вы можете найти аргументацию Тейлора здесь :

Очень плохо использовать сеанс или аутентификацию в вашем конструкторе, так как запрос еще не произошел, а сеанс и auth по своей природе привязаны к HTTP-запросу. Вы должны получить этот запрос в реальном методе контроллера, который вы можете вызвать несколько раз с несколькими различными запросами. Вынуждая ваш контроллер разрешать информацию о сеансе или аутентификации в конструкторе, вы теперь заставляете весь свой контроллер игнорировать фактический входящий запрос, который может вызвать значительные проблемы при тестировании, и т. Д. c.

Решением было бы получить пользователя и компанию из запроса в каждом методе контроллера, но если вы хотите сохранить его в конструкторе, вы можете реализовать следующий обходной путь:

class ProjectController extends Controller
{
    public $company;

    public $user;

    public function __construct(Request $request)
    {
        $this->middleware(function ($request, $next) {
            $this->company = $request->user()->company;

            $this->user = $request->user();

            return $next($request);
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...