@nitra/vite-boot
Version:
94 lines (82 loc) • 3.25 kB
JavaScript
import { checkToken, getToken } from './token.js'
import { setUser, user } from './user.js'
export let router
/**
* Зберігає інстанс роутера для подальшого використання
* @param {import('vue-router').Router} r - Інстанс роутера
*/
export function setRouter(r) {
router = r
}
/**
* Перевіряє доступ користувача до маршруту
* @param {import('vue-router').RouteLocationNormalized} to - Маршрут призначення
* @returns {boolean} - Чи дозволено доступ
*/
export function canUserAccess(to) {
// Якщо сторінка без обмеження по ролям то дозволяємо завжди
if (to.meta?.layout === 404 || to.meta?.layout === 'blank') {
return true
}
// Якщо є обмеження на сторінці по ролям
const token = getToken()
if (!token) {
// Записуємо поточний урл в session storage
// щоб потім на нього повернути після логіну
// прибрати у рядку слеш, якщо він є першим символом
const url = `${import.meta.env.BASE_URL}${to.path.startsWith('/') ? to.path.slice(1) : to.path}`
sessionStorage.setItem('url-before-logout', url)
return false
}
// Якщо перший раз запускаємо - завантажуємо користувача
if (!user.role) {
const check = checkToken(token)
if (check.result === 'ok') {
setUser(check.decoded, token)
} else {
return false
}
}
// Якщо на сторінці не вказано обмеження по ролі
if (!to.meta?.roles) {
return true
}
// Якщо вказано - чи входить в дозволені користувачу
if (to.meta?.roles.includes(user.role)) {
return true
}
return false
}
/**
* Перевіряє доступ за наявності ролей у метаданих маршруту
* @param {import('vue-router').RouteLocationNormalized} to - Маршрут призначення
* @returns {boolean} - Чи дозволено доступ
*/
export function canUserAccessMetaRoles(to) {
// Якщо сторінка без обмеження по ролям то дозволяємо завжди
if (to.meta?.layout === 404 || to.meta?.layout === 'blank' || !to.meta?.roles) {
return true
}
// Якщо є обмеження на сторінці по ролям
const token = getToken()
// Якщо токен є, то можна любі сторінки
if (!token) {
return false
}
// Якщо перший раз запускаємо - завантажуємо користувача
if (!user.role) {
const check = checkToken(token)
if (check.result === 'ok') {
setUser(check.decoded, token)
} else {
return false
}
}
// Якщо токена немає, та є обмеження на сторінці
// то забороняємо доступ
// if (to.meta?.roles.length > 0) {
// return false
// }
// Не пройшло обмеження по ролям
return true
}