Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 07 жовтня 2026

Порядок авторизації та прив’язки моделей у Laravel: чому замість 403 приходить 404

Команда Mastering Laravel дуже любить пакет laravel-permission і використовує його на більшості проєктів. Автор матеріалу Joel розповідає про неочевидну поведінку, яка виникає, коли авторизація на основі прав поєднується з прив’язкою моделей до маршрутів.

Перевірка прав через middleware can

Зручна особливість пакета в тому, що він дозволяє використовувати штатний middleware Laravel can, щоб перевірити, чи має користувач певний дозвіл. У файлі маршрутів можна обгорнути цілу групу маршрутів у перевірку на основі права:

// routes/web.php

Route::middleware('can:manage-articles')->group(function () {
    Route::get('/articles', 'ArticleController@index');
    Route::get('/articles/{article}', 'ArticleController@show');
    // more article routes...
});

У реальних проєктах замість рядка зазвичай використовують enum Permission, але в прикладі для простоти та читабельності вжито рядок.

Якщо в користувача немає права manage-articles, він не повинен мати доступу до жодного з цих маршрутів. Додаткові, більш деталізовані перевірки на кшталт «чи може він редагувати саме цю модель Article» тут не потрібні - доступ просто відхиляється на ранньому етапі.

Несподівана поведінка: 404 замість 403

Проте трапляється неочікуване. Якщо користувач без права доступу до цієї групи звертається до маршруту на кшталт /articles/123, де 123 - неіснуюча стаття, він отримає помилку 404, а не очікувану 403. Причина - route model binding.

За замовчуванням Laravel надає middleware SubstituteBindings вищий пріоритет, ніж middleware Authorize. Тому, якщо модель не знайдено, відповідь 404 повертається ще до того, як Authorize матиме змогу віддати 403.

Чому порядок саме такий

Перш ніж шукати рішення, варто зрозуміти, навіщо так зроблено. Деякі методи класичних політик (policies) потребують уже прив’язаної моделі. Наприклад, типовий метод edit у політиці виглядає так:

public function edit(User $user, Article $article)
{
    return $user->id === $article->user_id;
}

Якщо модель не прив’язана, метод політики не можна виконати, а отже middleware Authorize не зможе виконати свою роботу. Тому логічно, що SubstituteBindings спрацьовує першим.

У розглянутому прикладі прив’язана модель не потрібна, але проста зміна порядку middleware місцями зламає ту частину логіки авторизації в політиках, яка залежить від прив’язаної моделі.

Рішення

У такому випадку можна скористатися middleware самого пакета - PermissionMiddleware - замість can, а також переконатися, що він має вищий пріоритет, ніж SubstituteBindings. Так перевірка прав виконається раніше за прив’язку моделей, а політики, що потребують моделі, продовжать працювати як раніше.

17

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

9
CSRF і завантаження
Новини 09 жовтня 2026

Порада з безпеки: як завантаження файлів може обійти захист від CSRF

Стівен Ріс-Картер пояснює, чому файли користувачів варто віддавати з окремого домену: HTML і JS у межах основного застосунку дають доступ до cookie та CSRF-токенів.

18

Вакансії за темою

Key2Law
26 днів тому

Full Stack Developer (Laravel)

Full Stack розробник на Laravel для розробки та підтримки веб-додатків. Відповідальний за реалізацію backend (REST APIs, бізнес-логіка, оптимізація БД) і frontend (Blade, Tailwind, Alpine/Livewire/Vue), тестування, деплой та моніторинг. Вимоги: PHP 8.1+, Laravel 10+, знання Eloquent, Queue, Redis, MySQL, JavaScript ES6+, PHPUnit/Pest, Docker, Git, основи AWS. Бажано досвід з Fintech, криптовалютами, high-availability системами.

N-iX Нова
2 дні тому

Senior/ Lead PHP Engineer (with AI Skills) (#5828)

Розробка та підтримка backend-сервісів і API на PHP та Laravel з повним циклом володіння фічами від дизайну до моніторингу. Ключове завдання - інтеграція агентних AI-workflow (LLM-агенти, tool calling) у продукт і внутрішні інструменти, а також менторство інших інженерів. Вимоги: 6+ років PHP, 4+ роки з Laravel, досвід GenAI, знання MySQL/PostgreSQL, Docker та хмарних платформ, робота за часовим поясом EDT.

Full Stack Developer (middle+)

Full Stack розробник розвиватиме та підтримуватиме вебпродукти FinTech-компанії: доопрацьовуватиме backend і frontend, функціонал особистого кабінету клієнта, інтеграції через REST API з платіжними та ідентифікаційними сервісами. Ключовий стек: PHP, Laravel, Vue.js (Vue Router, Pinia або Vuex), MySQL/PostgreSQL, Docker, Git. Вимоги: понад 3 роки комерційного Full Stack досвіду, робота з наявним кодом, участь у code review та розборі інцидентів.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

28,224 v2.5.0 13 26

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,779 15.37.4 12