From 52db6eff530dd39fd7def7d885476268f98f49eb Mon Sep 17 00:00:00 2001 From: chpark Date: Tue, 12 May 2026 00:26:22 +0900 Subject: [PATCH] =?UTF-8?q?fix(menu):=20isAdmin=20=EB=B0=B1=EB=8F=84?= =?UTF-8?q?=EC=96=B4=20=EC=A0=9C=EA=B1=B0=20=E2=80=94=20=EA=B6=8C=ED=95=9C?= =?UTF-8?q?=20=EA=B7=B8=EB=A3=B9=20=EB=A7=A4=ED=95=91=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=99=EC=A0=81=20=EB=85=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 SQL 은 $isAdmin=true 면 모든 메뉴 통과 → 권한 매핑이 의미 없었음. 사용자 요청: "로그인한 사용자 권한 그룹에 따른 메뉴가 동적으로 나오도록" - /api/menu: isAdmin 분기 제거, authority_sub_user JOIN authority_sub_menu 매핑만 사용. 자식이 권한에 있으면 부모도 자동 노출(트리 유지) 로직은 유지 - 운영 DB: 관리자그룹에 active 메뉴 36개 일괄 매핑 (재고 이력 9000304 포함). 사용자 관리 화면에서 권한 그룹 멤버 / 메뉴 매핑을 직접 조정해 사용자별 사이드바를 동적으로 제어 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/app/api/menu/route.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/app/api/menu/route.ts b/src/app/api/menu/route.ts index 80500ef..0632f30 100644 --- a/src/app/api/menu/route.ts +++ b/src/app/api/menu/route.ts @@ -11,9 +11,9 @@ export async function POST(request: NextRequest) { const body = await request.json(); const menuObjId = body.MENUOBJID || ""; - const isAdmin = !!user.isAdmin; - // super admin = 모든 메뉴, 일반 사용자 = 권한 그룹 매핑된 메뉴만 (자식이 있으면 부모도 자동 노출) + // 로그인한 사용자의 권한 그룹에 매핑된 메뉴만 노출 (자식이 권한에 있으면 부모 자동 표시). + // isAdmin 같은 백도어는 두지 않음 — 모든 사용자는 권한 그룹 매핑대로 동적으로 메뉴를 받는다. const rows = await queryRows( `SELECT MI.OBJID::text AS "objid", MI.MENU_NAME_KOR AS "menuNameKor", @@ -27,12 +27,11 @@ export async function POST(request: NextRequest) { AND (MI.PARENT_OBJ_ID = $1::numeric OR MI.PARENT_OBJ_ID IN (SELECT OBJID FROM MENU_INFO WHERE PARENT_OBJ_ID = $1::numeric AND COALESCE(STATUS, '') = 'active')) AND ( - $2::boolean = true - OR MI.OBJID IN ( + MI.OBJID IN ( SELECT ASM.menu_objid FROM authority_sub_user ASU JOIN authority_sub_menu ASM ON ASM.master_objid = ASU.master_objid - WHERE ASU.user_id = $3::text + WHERE ASU.user_id = $2::text ) OR EXISTS ( SELECT 1 FROM menu_info CH @@ -41,12 +40,12 @@ export async function POST(request: NextRequest) { SELECT ASM.menu_objid FROM authority_sub_user ASU JOIN authority_sub_menu ASM ON ASM.master_objid = ASU.master_objid - WHERE ASU.user_id = $3::text + WHERE ASU.user_id = $2::text ) ) ) ORDER BY MI.SEQ`, - [menuObjId, isAdmin, user.userId] + [menuObjId, user.userId] ); return NextResponse.json({ RESULT: rows });