Fix Middleware
Fix Layout sesuai role, dan superadmin bisa menambahkan menu ke user jika diperlukan Penambahan menu di user & role : menu access
This commit is contained in:
@@ -1,46 +1,98 @@
|
||||
// app/middleware.js
|
||||
import { NextResponse, NextRequest } from 'next/server';
|
||||
// // 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
|
||||
// // 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',
|
||||
];
|
||||
|
||||
// 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 async function middleware(request: NextRequest) {
|
||||
const path = request.nextUrl.pathname;
|
||||
|
||||
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
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
// Konfigurasi untuk menentukan path mana yang akan dijalankan middleware
|
||||
// Hanya berlaku untuk /admin/*
|
||||
export const config = {
|
||||
matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], // Jalankan middleware untuk semua route kecuali file statis
|
||||
matcher: ['/admin/:path*'],
|
||||
};
|
||||
Reference in New Issue
Block a user