Привязка модели выполняется перед промежуточным программным обеспечением auth

#laravel #model-binding #laravel-middleware

#laravel #привязка модели #laravel-промежуточное программное обеспечение

Вопрос:

Я хочу спросить, как вы можете запустить промежуточное программное обеспечение аутентификации перед привязкой модели? В настоящее время в моем приложении 5.7 привязка модели выполняется перед авторизацией. Я попытался создать промежуточную рабочую группу в kernel.php следующим образом:

         'api' => [
        'throttle:10,1',
        'jwt.middleware',
        'bindings',
    ],
  

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

Комментарии:

1. что вы используете для своего промежуточного программного обеспечения аутентификации? поскольку приоритеты промежуточного программного обеспечения определяют, чтобы промежуточное программное обеспечение аутентификации по умолчанию запускалось перед промежуточным программным обеспечением привязки, вы можете увидеть это в $middlewarePriority массиве в ядре

2. Я использую пользовательский контроллер аутентификации с использованием JWT

3. тогда это не промежуточное программное обеспечение ‘auth’… таким образом, вам нужно будет добавить в $middlewarePriority массив, чтобы добавить класс для этого промежуточного программного обеспечения, каким бы оно ни jwt.middleware было, перед промежуточным программным обеспечением привязок

Ответ №1:

Ответ в: https://laravel.com/docs/5.7/middleware#sorting-middleware

 protected $middlewarePriority = [
    IlluminateSessionMiddlewareStartSession::class,
    IlluminateViewMiddlewareShareErrorsFromSession::class,
    AppHttpMiddlewareAuthenticate::class,
    IlluminateSessionMiddlewareAuthenticateSession::class,
    IlluminateAuthMiddlewareAuthorize::class,
    IlluminateRoutingMiddlewareSubstituteBindings::class,
];
  

Ответ №2:

ЕСЛИ вы используете явные привязки, они могут выполняться перед промежуточным программным обеспечением auth. В этом случае вы можете использовать Auth::authenticate() , чтобы выбросить AuthenticationException , который laravel преобразует в перенаправление на страницу входа.

 Route::bind('user_post', fn ($id) => Auth::authenticate()->posts()->findOrFail($id));
  
 Route::get('posts/{user_post}', ...);