From 02a6bb60251d6255e5599e66f00551d2aa5e3129 Mon Sep 17 00:00:00 2001 From: Flycro Date: Sat, 11 Nov 2023 16:32:21 +0100 Subject: [PATCH] feat(Roles): Added Role Functionality --- composables/useAuth.ts | 21 +++++++++++++++++---- composables/useRoles.ts | 11 +++++++++++ middleware/admin.ts | 11 +++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 composables/useRoles.ts create mode 100644 middleware/admin.ts diff --git a/composables/useAuth.ts b/composables/useAuth.ts index 587e12c..5ce1e03 100644 --- a/composables/useAuth.ts +++ b/composables/useAuth.ts @@ -5,10 +5,15 @@ export interface User { email_verified_at: string | null password?: string remember_token?: string | null + roles: Role[] created_at: string | null updated_at: string | null } +export interface Role { + name: string +} + export interface LoginCredentials { email: string password: string @@ -50,7 +55,9 @@ export function useAuth() { } async function login(credentials: LoginCredentials) { - if (isLoggedIn.value) { return } + if (isLoggedIn.value) { + return + } await $larafetch('/login', { method: 'post', body: credentials }) await refresh() @@ -71,7 +78,9 @@ export function useAuth() { } async function logout() { - if (!isLoggedIn.value) { return } + if (!isLoggedIn.value) { + return + } await $larafetch('/logout', { method: 'post' }) user.value = null @@ -114,8 +123,12 @@ export async function fetchCurrentUser() { return await $larafetch('/api/user') } catch (error: any) { - if ([401, 419].includes(error?.response?.status)) { return null } - if (error?.response?.status === undefined) { return null } + if ([401, 419].includes(error?.response?.status)) { + return null + } + if (error?.response?.status === undefined) { + return null + } throw error } } diff --git a/composables/useRoles.ts b/composables/useRoles.ts new file mode 100644 index 0000000..ff33f18 --- /dev/null +++ b/composables/useRoles.ts @@ -0,0 +1,11 @@ +export function useRoles() { + const user = useUser() + + function hasRole(roleName: string) { + return user.value?.roles?.some(role => role.name === roleName) ?? false + } + + return { + hasRole, + } +} diff --git a/middleware/admin.ts b/middleware/admin.ts new file mode 100644 index 0000000..32deea9 --- /dev/null +++ b/middleware/admin.ts @@ -0,0 +1,11 @@ +export default defineNuxtRouteMiddleware(async () => { + const { hasRole } = useRoles() + const requiredRole = 'super-admin1' // Define the role required for this route + + if (!hasRole(requiredRole)) { + return abortNavigation({ + message: 'You are not authorized to access this page', + statusCode: 403, + }) + } +})