// components/ProtectedRoute.tsx import { useSession, signIn } from "next-auth/react"; import { useEffect, ReactNode } from "react"; import { useRouter } from 'next/router'; import { UserRole } from '../Enums/UserRole'; import { getSession } from "next-auth/react"; interface ProtectedRouteProps { children: ReactNode; allowedRoles: UserRole[]; deniedMessage?: string; bypass?: boolean; autoRedirect?: boolean; } const ProtectedRoute = ({ children, allowedRoles, deniedMessage, bypass = false, autoRedirect = false }: ProtectedRouteProps) => { const { data: session, status } = useSession() const router = useRouter(); useEffect(() => { //console.log("session.role:" + session?.user?.role); if (!status || status === "unauthenticated") { // Redirect to the sign-in page if (autoRedirect) { signIn(); } } else { console.log("session.role:" + session?.user?.role); } }, [session, status, router]); if (status === "authenticated") { const userRole = session.user.role as UserRole; // Assuming role is part of the session object // Grant access if allowedRoles is not defined, or if the user's role is among the allowed roles if (bypass || !allowedRoles || (allowedRoles && allowedRoles.includes(userRole))) { return <>{children}; } // Handle denied access if (deniedMessage !== undefined) { return
{deniedMessage}
; } return ( <>

{session?.user?.email},

{`Нямате достъп до тази страница. Ако мислите, че това е грешка, моля, свържете се с администраторите`}

); } if (status === "loading") { return
Зареждане...
; } if (!session) { if (deniedMessage !== undefined) { return
{deniedMessage}
; } return Защитено съдържание. Впишете се.. } }; export default ProtectedRoute; export async function serverSideAuth({ req, allowedRoles }) { const session = await getSession({ req }); if (!session || (allowedRoles && !allowedRoles.includes(session.user.role))) { // User is not authenticated or doesn't have the required role return { redirect: { destination: '/api/auth/signin', // Redirect to the sign-in page permanent: false, }, }; } // Return the session if the user is authenticated and has the required role return { session }; } // Static method to check if the user has a specific role ProtectedRoute.IsInRole = async (roleName) => { const session = await getSession(); return session && session.user && session.user.role === roleName; };