Библиотека Navigo обеспечивает управление маршрутизацией в одностраничных приложениях на JavaScript. Одним из ключевых аспектов работы с маршрутами является контроль доступа к определённым страницам или компонентам на основе состояния авторизации пользователя. Этот процесс требует интеграции состояния аутентификации с механизмом маршрутизации.
before:const router = new Navigo('/');
router.before((done, params, route) => {
const isAuthenticated = Boolean(localStorage.getItem('authToken'));
if (!isAuthenticated && route.name === 'private') {
router.navigate('/login');
} else {
done();
}
});
done — функция, вызываемая для продолжения
маршрутизации.route — объект текущего маршрута, содержащий имя, путь
и параметры.router.on('/dashboard', () => {
const isAuthenticated = Boolean(localStorage.getItem('authToken'));
if (!isAuthenticated) {
router.navigate('/login');
return;
}
renderDashboard();
}, { name: 'dashboard' });
renderDashboard() — функция, отвечающая за отрисовку
защищённого контента.Navigo позволяет задавать имена маршрутов через
опцию name. Это упрощает проверку и делает код более
читаемым:
router.on('/profile', () => {
renderProfile();
}, { name: 'profile' });
const protectedRoutes = ['dashboard', 'profile'];
router.before((done, params, route) => {
const isAuthenticated = Boolean(localStorage.getItem('authToken'));
if (!isAuthenticated && protectedRoutes.includes(route.name)) {
router.navigate('/login');
} else {
done();
}
});
protectedRoutes содержит маршруты, доступ к
которым ограничен.Иногда состояние авторизации определяется не локально, а через API. В Navigo можно использовать асинхронные проверки перед переходом на маршрут:
router.before(async (done, params, route) => {
const isAuthenticated = await checkAuthFromServer();
if (!isAuthenticated && route.name === 'private') {
router.navigate('/login');
} else {
done();
}
});
async function checkAuthFromServer() {
const response = await fetch('/api/check-auth', { credentials: 'include' });
const result = await response.json();
return result.authenticated;
}
done() вызывается только после завершения асинхронной
операции.Навигация часто использует динамические параметры, например
/users/:id. Проверка авторизации при этом может зависеть не
только от глобального состояния, но и от конкретного ресурса:
router.on('/users/:id', ({ data }) => {
const userId = data.id;
const currentUserId = getCurrentUserId();
if (!currentUserId || currentUserId !== userId) {
router.navigate('/unauthorized');
return;
}
renderUserProfile(userId);
}, { name: 'userProfile' });
data содержит динамические параметры маршрута.router.before, чтобы исключить дублирование кода.Такой подход позволяет построить надёжную и гибкую систему контроля доступа в приложениях на Navigo, сохраняя маршруты простыми для поддержки и расширения.