#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}', ...);