diff --git a/ui/src/pages/Unauthorized.vue b/ui/src/pages/Unauthorized.vue index 81340d7..a00d5a7 100644 --- a/ui/src/pages/Unauthorized.vue +++ b/ui/src/pages/Unauthorized.vue @@ -10,10 +10,6 @@ - - @@ -21,7 +17,7 @@ \ No newline at end of file diff --git a/ui/src/router/index.js b/ui/src/router/index.js index b69baa2..f886f04 100644 --- a/ui/src/router/index.js +++ b/ui/src/router/index.js @@ -37,16 +37,16 @@ const router = createRouter({ }) router.beforeEach(async (to) => { - const userStore = useUserStore() + const user = useUserStore() // Make sure user state is loaded before checking - if (!userStore.loaded) { + if (!user.loaded) { console.log('loaduser') - await userStore.loadUser(); + await user.loadUser(); } // Not logged in - if (to.meta.requiresAuth && !userStore.isLoggedIn) { + if (to.meta.requiresAuth && !user.isLoggedIn) { // Redirect back to original page after login const redirectUrl = encodeURIComponent(window.location.origin + to.fullPath) window.location.href = `https://aj17thdevapi.nexuszone.net/login?redirect=${redirectUrl}` @@ -55,14 +55,16 @@ router.beforeEach(async (to) => { // Must be a member - if (to.meta.memberOnly && userStore.state !== 'member') { + if (to.meta.memberOnly && user.state !== 'member') { return '/unauthorized' } - // // Must have specific role - // if (to.meta.roles && !to.meta.roles.includes(userStore.role)) { - // return '/unauthorized' - // } + console.log(!user.hasRole("Dev")); + + // Must have specific role + if (to.meta.roles && !user.hasRole('Dev') && !user.hasAnyRole(to.meta.roles)) { + return '/unauthorized' + } }) export default router; \ No newline at end of file diff --git a/ui/src/stores/user.ts b/ui/src/stores/user.ts index 2e9ca64..ec75250 100644 --- a/ui/src/stores/user.ts +++ b/ui/src/stores/user.ts @@ -3,9 +3,9 @@ import { defineStore } from 'pinia' export const useUserStore = defineStore('user', () => { const user = ref(null) - const roles = computed(() => { user.value.roles }) + const roles = computed(() => new Set(user.value?.roleData?.map(r => r.name) ?? [])); const loaded = ref(false); - + const state = computed(() => user.value.state); const isLoggedIn = computed(() => user.value !== null) async function loadUser() { @@ -23,5 +23,15 @@ export const useUserStore = defineStore('user', () => { loaded.value = true; } - return { user, isLoggedIn, roles, loadUser, loaded } + + function hasRole(role: string): boolean { + return roles.value.has(role) + } + + + function hasAnyRole(requiredRoles: string[]): boolean { + return requiredRoles.some(r => roles.value.has(r)) + } + + return { user, isLoggedIn, roles, loadUser, loaded, hasAnyRole, hasRole, state } })