Fix Layout sesuai role, dan superadmin bisa menambahkan menu ke user jika diperlukan Penambahan menu di user & role : menu access
98 lines
3.2 KiB
TypeScript
98 lines
3.2 KiB
TypeScript
// // app/middleware.js
|
|
// import { NextResponse, NextRequest } from 'next/server';
|
|
|
|
// // Daftar route yang diizinkan tanpa login (public routes)
|
|
// const publicRoutes = [
|
|
// '/*', // Home page
|
|
// '/about', // About page
|
|
// '/public/*', // Wildcard untuk semua route di bawah /public
|
|
// '/login', // Halaman login
|
|
// ];
|
|
|
|
// // Fungsi untuk memeriksa apakah route saat ini adalah route publik
|
|
// function isPublicRoute(pathname: string) {
|
|
// return publicRoutes.some((route) => {
|
|
// // Jika route mengandung wildcard (*), gunakan regex untuk mencocokkan
|
|
// if (route.endsWith('*')) {
|
|
// const baseRoute = route.replace('*', ''); // Hapus wildcard
|
|
// return pathname.startsWith(baseRoute); // Cocokkan dengan pathname
|
|
// }
|
|
// return pathname === route; // Cocokkan exact path
|
|
// });
|
|
// }
|
|
|
|
// export function middleware(request: NextRequest) {
|
|
// const { pathname } = request.nextUrl;
|
|
|
|
// // Jika route adalah public, izinkan akses
|
|
// if (isPublicRoute(pathname)) {
|
|
// return NextResponse.next();
|
|
// }
|
|
|
|
// // Jika bukan public route, periksa apakah pengguna sudah login
|
|
// const isLoggedIn = request.cookies.get('darmasaba-auth-token'); // Contoh: cek cookie auth-token
|
|
// if (!isLoggedIn) {
|
|
// // Redirect ke halaman login jika belum login
|
|
// return NextResponse.redirect(new URL('/login', request.url));
|
|
// }
|
|
|
|
// // Jika sudah login, izinkan akses
|
|
// return NextResponse.next();
|
|
// }
|
|
|
|
// // Konfigurasi untuk menentukan path mana yang akan dijalankan middleware
|
|
// export const config = {
|
|
// matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], // Jalankan middleware untuk semua route kecuali file statis
|
|
// };
|
|
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
// src/app/admin/middleware.ts
|
|
import { NextResponse } from 'next/server';
|
|
import type { NextRequest } from 'next/server';
|
|
import { jwtVerify } from 'jose';
|
|
|
|
// Route publik di dalam /admin (boleh diakses tanpa login penuh)
|
|
const PUBLIC_ADMIN_ROUTES = [
|
|
'/admin/login',
|
|
'/admin/registrasi',
|
|
'/admin/validasi',
|
|
'/admin/waiting-room',
|
|
];
|
|
|
|
export async function middleware(request: NextRequest) {
|
|
const path = request.nextUrl.pathname;
|
|
|
|
// Izinkan akses ke route publik di /admin
|
|
if (PUBLIC_ADMIN_ROUTES.some(route => path.startsWith(route))) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
// Ambil token dari cookie
|
|
const token = request.cookies.get(process.env.BASE_SESSION_KEY!)?.value;
|
|
if (!token) {
|
|
return NextResponse.redirect(new URL('/login', request.url));
|
|
}
|
|
|
|
try {
|
|
// Verifikasi JWT
|
|
const secret = new TextEncoder().encode(process.env.BASE_TOKEN_KEY!);
|
|
const { payload } = await jwtVerify(token, secret);
|
|
const user = (payload as any).user;
|
|
|
|
// Cek apakah user aktif
|
|
if (!user || !user.isActive) {
|
|
return NextResponse.redirect(new URL('/login', request.url));
|
|
}
|
|
|
|
// ✅ User valid → izinkan akses
|
|
return NextResponse.next();
|
|
} catch (error) {
|
|
console.error('Middleware auth error:', error);
|
|
return NextResponse.redirect(new URL('/login', request.url));
|
|
}
|
|
}
|
|
|
|
// Hanya berlaku untuk /admin/*
|
|
export const config = {
|
|
matcher: ['/admin/:path*'],
|
|
}; |