58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
|
|
export default defineNuxtRouteMiddleware(async (to) => {
|
||
|
|
// Skip on server-side rendering
|
||
|
|
if (import.meta.server) return;
|
||
|
|
|
||
|
|
// Skip if no auth requirements or roles specified
|
||
|
|
if (!to.meta.roles) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('[AUTHORIZATION] Checking route access for:', to.path, 'Required roles:', to.meta.roles);
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Get current session data with groups
|
||
|
|
const sessionData = await $fetch('/api/auth/session') as any;
|
||
|
|
|
||
|
|
if (!sessionData.authenticated || !sessionData.user) {
|
||
|
|
console.log('[AUTHORIZATION] User not authenticated, redirecting to login');
|
||
|
|
return navigateTo('/login');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get required roles for this route
|
||
|
|
const requiredRoles = Array.isArray(to.meta.roles) ? to.meta.roles : [to.meta.roles];
|
||
|
|
const userGroups = sessionData.groups || [];
|
||
|
|
|
||
|
|
// Check if user has any of the required roles
|
||
|
|
const hasRequiredRole = requiredRoles.some(role => userGroups.includes(role));
|
||
|
|
|
||
|
|
if (!hasRequiredRole) {
|
||
|
|
console.log('[AUTHORIZATION] Access denied. User groups:', userGroups, 'Required roles:', requiredRoles);
|
||
|
|
|
||
|
|
// Store the error in nuxtApp to show toast on redirect
|
||
|
|
const nuxtApp = useNuxtApp();
|
||
|
|
nuxtApp.payload.authError = `Access denied. This page requires one of the following roles: ${requiredRoles.join(', ')}`;
|
||
|
|
|
||
|
|
// Redirect to dashboard instead of login since user is authenticated
|
||
|
|
return navigateTo('/dashboard');
|
||
|
|
}
|
||
|
|
|
||
|
|
// Store auth state in nuxtApp for use by components
|
||
|
|
const nuxtApp = useNuxtApp();
|
||
|
|
if (!nuxtApp.payload.data) {
|
||
|
|
nuxtApp.payload.data = {};
|
||
|
|
}
|
||
|
|
nuxtApp.payload.data.authState = {
|
||
|
|
user: sessionData.user,
|
||
|
|
authenticated: sessionData.authenticated,
|
||
|
|
groups: sessionData.groups || []
|
||
|
|
};
|
||
|
|
|
||
|
|
console.log('[AUTHORIZATION] Access granted for route:', to.path);
|
||
|
|
} catch (error) {
|
||
|
|
console.error('[AUTHORIZATION] Error checking route access:', error);
|
||
|
|
|
||
|
|
// If session check fails, redirect to login
|
||
|
|
return navigateTo('/login');
|
||
|
|
}
|
||
|
|
});
|