В Vue Router редирект на страницу входа обычно используется для защиты маршрутов, требующих аутентификации. Основная идея заключается в том, чтобы при попытке пользователя перейти на защищённый маршрут, не пройдя авторизацию, автоматически перенаправлять его на страницу входа.
Для начала необходимо определить маршрут для страницы входа в конфигурации маршрутов:
import { createRouter, createWebHistory } from 'vue-router';
import Login from '@/views/Login.vue';
import Dashboard from '@/views/Dashboard.vue';
const routes = [
{
path: '/login',
name: 'Login',
component: Login
},
{
path: '/dashboard',
name: 'Dashboard',
component: Dashboard,
meta: { requiresAuth: true } // мета-поле для защиты маршрута
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
Здесь ключевой момент — использование мета-поля
requiresAuth. Оно позволяет идентифицировать маршруты,
доступ к которым возможен только после аутентификации.
Для реализации редиректа используется глобальный навигационный
охранник beforeEach. Он проверяет состояние авторизации
пользователя перед переходом на маршрут:
router.beforeEach((to, from, next) => {
const isAuthenticated = Boolean(localStorage.getItem('token')); // простая проверка наличия токена
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'Login', query: { redirect: to.fullPath } });
} else {
next();
}
});
Ключевые моменты:
to.meta.requiresAuth — проверка, требуется ли
авторизация для текущего маршрута.isAuthenticated — логика определения состояния
пользователя. В реальных приложениях часто используется Vuex или Pinia
для хранения информации о пользователе.query: { redirect: to.fullPath } — сохраняет исходный
маршрут, чтобы после успешного входа пользователь мог быть перенаправлен
на страницу, которую он пытался открыть.После прохождения аутентификации нужно вернуть пользователя на первоначально запрошенный маршрут. Обычно это делается в компоненте входа:
<script setup>
import { useRouter, useRoute } from 'vue-router';
const router = useRouter();
const route = useRoute();
function login() {
// Пример логики аутентификации
localStorage.setItem('token', 'example-token');
const redirectTo = route.query.redirect || '/dashboard';
router.push(redirectTo);
}
</script>
Разбор логики:
route.query.redirect — извлекается маршрут, который
пользователь пытался открыть до входа.redirect отсутствует, используется маршрут по
умолчанию, например, /dashboard.router.push(redirectTo) — выполняется перенаправление
на нужную страницу.Редирект также корректно работает для маршрутов с динамическими параметрами:
{
path: '/profile/:id',
name: 'Profile',
component: () => import('@/views/Profile.vue'),
meta: { requiresAuth: true }
}
В этом случае to.fullPath сохраняет полный путь, включая
параметр id, что позволяет корректно возвращать
пользователя на конкретный профиль после входа.
Вместо глобального beforeEach можно использовать
beforeEnter для отдельных маршрутов:
{
path: '/dashboard',
name: 'Dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
const isAuthenticated = Boolean(localStorage.getItem('token'));
if (!isAuthenticated) {
next({ name: 'Login', query: { redirect: to.fullPath } });
} else {
next();
}
}
}
Это позволяет более локально контролировать поведение маршрута, без глобальной проверки для всех маршрутов.
При выходе пользователя важно удалять токен и перенаправлять его на страницу входа:
function logout() {
localStorage.removeItem('token');
router.push({ name: 'Login' });
}
Дополнительно можно сбрасывать состояние приложения, чтобы закрыть доступ к защищённым компонентам до повторной авторизации.
Редирект на страницу входа в Vue Router — ключевой инструмент при построении защищённых SPA, обеспечивающий безопасность и удобство навигации.