Navigo — это легковесная библиотека маршрутизации для JavaScript, которая позволяет управлять навигацией в одностраничных приложениях (SPA). Одной из ключевых задач при построении SPA является ограничение доступа к определённым маршрутам в зависимости от состояния пользователя: авторизован или нет, имеет ли он нужные права, роль или подписку. В Navigo это достигается с помощью комбинации условной логики в обработчиках маршрутов и переадресации (redirect).
Создание экземпляра Navigo выполняется через конструктор с указанием базового пути и опций:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
Опция hash: true позволяет использовать
хеш-маршрутизацию (/#/path), что удобно для SPA без
серверной настройки.
Защищённый маршрут — это маршрут, доступ к которому должен быть ограничен. В Navigo нет встроенной системы аутентификации, поэтому контроль выполняется через функцию-обработчик маршрута. Пример:
function requireAuth(handler) {
return function(...params) {
const user = JSON.parse(localStorage.getItem('user'));
if (user && user.isLoggedIn) {
handler(...params);
} else {
router.navigate('/login');
}
}
}
requireAuth — обёртка для маршрутов, проверяющая
наличие пользователя и его состояние авторизации.router.on('/dashboard', requireAuth(() => {
document.body.innerHTML = '<h1>Панель управления</h1>';
}));
router.on('/login', () => {
document.body.innerHTML = '<h1>Страница логина</h1>';
});
/dashboard проверяется состояние
авторизации./login.Для SPA с разными уровнями прав доступа необходимо проверять роль
пользователя. Можно создать обёртку requireRole:
function requireRole(role, handler) {
return function(...params) {
const user = JSON.parse(localStorage.getItem('user'));
if (user && user.roles.includes(role)) {
handler(...params);
} else {
router.navigate('/forbidden');
}
}
}
Пример маршрута с ограничением по роли:
router.on('/admin', requireRole('admin', () => {
document.body.innerHTML = '<h1>Админ-панель</h1>';
}));
router.on('/forbidden', () => {
document.body.innerHTML = '<h1>Доступ запрещён</h1>';
});
/admin имеют только
пользователи с ролью admin.Navigo позволяет использовать динамические параметры маршрутов, что удобно для ограничения доступа на уровне ресурсов:
router.on('/profile/:userId', requireAuth((params) => {
const currentUser = JSON.parse(localStorage.getItem('user'));
if (currentUser.id === params.userId || currentUser.roles.includes('admin')) {
document.body.innerHTML = `<h1>Профиль пользователя ${params.userId}</h1>`;
} else {
router.navigate('/forbidden');
}
}));
beforeNavigo поддерживает глобальный хук before, который
вызывается перед обработкой любого маршрута:
router.hooks({
before: (done, params) => {
const user = JSON.parse(localStorage.getItem('user'));
if (!user || !user.isLoggedIn) {
router.navigate('/login');
done(false); // отменяем обработку текущего маршрута
} else {
done(); // продолжаем выполнение маршрута
}
}
});
done(false) — предотвращает выполнение обработчика
маршрута.Для комплексного контроля можно комбинировать обёртки маршрутов с глобальным хуком:
router.on('/dashboard', () => {
document.body.innerHTML = '<h1>Панель управления</h1>';
});
router.on('/admin', requireRole('admin', () => {
document.body.innerHTML = '<h1>Админ-панель</h1>';
}));
router.hooks({
before: (done) => {
const user = JSON.parse(localStorage.getItem('user'));
if (!user || !user.isLoggedIn) {
router.navigate('/login');
done(false);
} else {
done();
}
}
});
localStorage без шифрования.requireAuth,
requireRole) — гибкий способ управления доступом к
отдельным страницам.before) — эффективны
для массовой проверки авторизации.Правильная организация ограничения доступа в Navigo делает маршрутизацию безопасной, предсказуемой и удобной для масштабирования больших одностраничных приложений.