sysrot-hub
Version:
CLI de nueva generación para proyectos Next.js 14+ con IA multi-modelo, Web3 integration, internacionalización completa y roadmap realista 2025-2026
61 lines (49 loc) • 1.82 kB
text/typescript
import { NextResponse } from "next/server";
import { NextRequest } from "next/server";
import { getToken } from "next-auth/jwt";
import { UserRole } from "@/lib/roles";
// Rutas que no requieren autenticación
const publicRoutes = ["/", "/login", "/register", "/api/auth"];
// Rutas que requieren rol de administrador
const adminRoutes = ["/admin"];
// Función para verificar si una ruta es pública
const isPublicRoute = (path: string) => {
return publicRoutes.some((route) => path === route || path.startsWith(`${route}/`));
};
// Función para verificar si una ruta es de administrador
const isAdminRoute = (path: string) => {
return adminRoutes.some((route) => path === route || path.startsWith(`${route}/`));
};
export async function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// Verificar si es una ruta pública
if (isPublicRoute(pathname)) {
return NextResponse.next();
}
// Verificar token de autenticación
const token = await getToken({ req: request });
// Si no hay token, redirigir al login
if (!token) {
const url = new URL("/login", request.url);
url.searchParams.set("callbackUrl", encodeURI(pathname));
return NextResponse.redirect(url);
}
// Verificar permisos para rutas de administrador
if (isAdminRoute(pathname)) {
const userRole = token.role as UserRole;
if (userRole !== "admin") {
// Si no es admin, redirigir a la página principal
return NextResponse.redirect(new URL("/", request.url));
}
}
return NextResponse.next();
}
export const config = {
matcher: [
// Rutas que requieren autenticación
"/dashboard/:path*",
"/profile/:path*",
"/admin/:path*",
"/api/((?!auth).)*",
],
};