Navigation guards - функції, що виконуються перед переходом і можуть його дозволити, скасувати чи перенаправити.
Глобальний guard з перевіркою meta маршруту:
const routes = [
{ path: '/login', name: 'login', component: Login },
{ path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } },
];
router.beforeEach((to, from) => {
const auth = useAuthStore();
if (to.meta.requiresAuth && !auth.isLoggedIn) {
return { name: 'login', query: { redirect: to.fullPath } };
}
// нічого не повертати (або true) - перехід дозволено
});
Що може повернути guard:
undefined/true- продовжити;false- скасувати перехід;- маршрут (рядок чи об'єкт) - перенаправити;
- Promise - роутер дочекається результату (async-guard з запитом до API).
Третій аргумент next досі підтримується, але документація радить повертати значення: з next легко забути виклик чи викликати його двічі.
meta успадковується: перевірка to.meta.requiresAuth спрацює й для вкладених маршрутів, якщо мета задана на батьківському (точніше - to.matched.some(r => r.meta.requiresAuth) враховує всі рівні).
Інші guards:
beforeEnterу конфігурації маршруту - лише для нього;onBeforeRouteLeaveу компоненті - попередити про незбережені зміни;onBeforeRouteUpdate- коли змінюються параметри того самого маршруту;router.afterEach- аналітика, заголовок сторінки (не може скасувати перехід).
Головне застереження: guard - це зручність інтерфейсу, а не захист. Код сторінки вже завантажено в браузер, а будь-хто може змінити стан стору в devtools. Справжній захист - на сервері: API має перевіряти автентифікацію й права на кожен запит.
Пастка нескінченного перенаправлення: guard, що відправляє на /login, не повинен застосовуватися до самого /login.