From da5bfcd4c45a155301815d70a51556984fe7831b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=ED=98=84=EC=84=9D?= Date: Wed, 15 Jan 2025 11:53:05 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=20=EC=9D=B8=EC=A6=9D=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#123)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add auth module * feat: add auth module to admin layout --- src/app/(admin)/layout.tsx | 5 +++- src/components/common/Auth/AuthModule.ts | 30 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/components/common/Auth/AuthModule.ts diff --git a/src/app/(admin)/layout.tsx b/src/app/(admin)/layout.tsx index 08739867..aee3568f 100644 --- a/src/app/(admin)/layout.tsx +++ b/src/app/(admin)/layout.tsx @@ -1,13 +1,16 @@ import { Metadata } from "next"; import classes from "./layout.module.css"; import { AdminSidebar } from "@/components/pages/AdminSidebar"; +import { AuthModule } from "@/components/common/Auth/AuthModule"; export const metadata: Metadata = { title: "S-TOP 기술교류회 관리자", description: "S-TOP 기술교류회 관리자", }; -export default function AdminLayout({ children }: { children: React.ReactNode }) { +export default async function AdminLayout({ children }: { children: React.ReactNode }) { + await AuthModule({ userType: ["ADMIN"] }); + return (
diff --git a/src/components/common/Auth/AuthModule.ts b/src/components/common/Auth/AuthModule.ts new file mode 100644 index 00000000..5ec9ead0 --- /dev/null +++ b/src/components/common/Auth/AuthModule.ts @@ -0,0 +1,30 @@ +"use server"; + +import { JWT_COOKIE_NAME } from "@/constants/Auth"; +import { redirect } from "next/navigation"; +import { cookies } from "next/headers"; +import { jwtDecode, JwtPayload } from "jwt-decode"; +import { Role } from "@/types/user"; + +export interface CustomJwtPayload extends JwtPayload { + userType: Role; +} + +interface Props { + userType: Role[]; +} + +export async function AuthModule({ userType }: Props): Promise<{ token: string }> { + const token = cookies().get(JWT_COOKIE_NAME)?.value; + + if (!token) { + redirect("/login"); + } + + const decoded = jwtDecode(token); + if (!userType.includes(decoded.userType)) { + redirect("/"); + } + + return { token }; +}