From 09323aaa4ca23d7b81a16d543419f48b03668c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Thu, 29 Jan 2026 13:04:37 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EA=B3=B5=ED=86=B5=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=8A=88=ED=8D=BC=EA=B4=80=EB=A6=AC=EC=9E=90=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EC=9A=B0=ED=9A=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 슈퍼관리자는 다른 테넌트/글로벌 코드 수정·토글·삭제 가능 Co-Authored-By: Claude Opus 4.5 --- app/Http/Controllers/CommonCodeController.php | 73 +++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/CommonCodeController.php b/app/Http/Controllers/CommonCodeController.php index 236f6e04..47d6d33e 100644 --- a/app/Http/Controllers/CommonCodeController.php +++ b/app/Http/Controllers/CommonCodeController.php @@ -178,19 +178,25 @@ public function update(Request $request, int $id): RedirectResponse|JsonResponse return redirect()->back()->with('error', '코드를 찾을 수 없습니다.'); } - // 권한 체크: 글로벌 코드는 HQ만, 테넌트 코드는 해당 테넌트만 - if ($code->tenant_id === null && ! $isHQ) { - if ($request->ajax()) { - return response()->json(['error' => '글로벌 코드는 본사만 수정할 수 있습니다.'], 403); - } - return redirect()->back()->with('error', '글로벌 코드는 본사만 수정할 수 있습니다.'); - } + // 권한 체크: 슈퍼관리자는 모든 코드 수정 가능 + $isSuperAdmin = auth()->user()?->isSuperAdmin() ?? false; - if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { - if ($request->ajax()) { - return response()->json(['error' => '다른 테넌트의 코드는 수정할 수 없습니다.'], 403); + if (! $isSuperAdmin) { + // 글로벌 코드는 HQ만 + if ($code->tenant_id === null && ! $isHQ) { + if ($request->ajax()) { + return response()->json(['error' => '글로벌 코드는 본사만 수정할 수 있습니다.'], 403); + } + return redirect()->back()->with('error', '글로벌 코드는 본사만 수정할 수 있습니다.'); + } + + // 테넌트 코드는 해당 테넌트만 + if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { + if ($request->ajax()) { + return response()->json(['error' => '다른 테넌트의 코드는 수정할 수 없습니다.'], 403); + } + return redirect()->back()->with('error', '다른 테넌트의 코드는 수정할 수 없습니다.'); } - return redirect()->back()->with('error', '다른 테넌트의 코드는 수정할 수 없습니다.'); } $validated = $request->validate([ @@ -244,13 +250,17 @@ public function toggle(Request $request, int $id): JsonResponse return response()->json(['error' => '코드를 찾을 수 없습니다.'], 404); } - // 권한 체크 - if ($code->tenant_id === null && ! $isHQ) { - return response()->json(['error' => '글로벌 코드는 본사만 수정할 수 있습니다.'], 403); - } + // 권한 체크: 슈퍼관리자는 모든 코드 수정 가능 + $isSuperAdmin = auth()->user()?->isSuperAdmin() ?? false; - if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { - return response()->json(['error' => '다른 테넌트의 코드는 수정할 수 없습니다.'], 403); + if (! $isSuperAdmin) { + if ($code->tenant_id === null && ! $isHQ) { + return response()->json(['error' => '글로벌 코드는 본사만 수정할 수 있습니다.'], 403); + } + + if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { + return response()->json(['error' => '다른 테넌트의 코드는 수정할 수 없습니다.'], 403); + } } $code->is_active = ! $code->is_active; @@ -438,20 +448,25 @@ public function destroy(Request $request, int $id): RedirectResponse|JsonRespons return redirect()->back()->with('error', '코드를 찾을 수 없습니다.'); } - // 글로벌 코드 삭제는 HQ만 - if ($code->tenant_id === null && ! $isHQ) { - if ($request->ajax()) { - return response()->json(['error' => '글로벌 코드는 본사만 삭제할 수 있습니다.'], 403); - } - return redirect()->back()->with('error', '글로벌 코드는 본사만 삭제할 수 있습니다.'); - } + // 권한 체크: 슈퍼관리자는 모든 코드 삭제 가능 + $isSuperAdmin = auth()->user()?->isSuperAdmin() ?? false; - // 다른 테넌트 코드 삭제 불가 - if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { - if ($request->ajax()) { - return response()->json(['error' => '다른 테넌트의 코드는 삭제할 수 없습니다.'], 403); + if (! $isSuperAdmin) { + // 글로벌 코드 삭제는 HQ만 + if ($code->tenant_id === null && ! $isHQ) { + if ($request->ajax()) { + return response()->json(['error' => '글로벌 코드는 본사만 삭제할 수 있습니다.'], 403); + } + return redirect()->back()->with('error', '글로벌 코드는 본사만 삭제할 수 있습니다.'); + } + + // 다른 테넌트 코드 삭제 불가 + if ($code->tenant_id !== null && $code->tenant_id !== $tenantId) { + if ($request->ajax()) { + return response()->json(['error' => '다른 테넌트의 코드는 삭제할 수 없습니다.'], 403); + } + return redirect()->back()->with('error', '다른 테넌트의 코드는 삭제할 수 없습니다.'); } - return redirect()->back()->with('error', '다른 테넌트의 코드는 삭제할 수 없습니다.'); } $codeGroup = $code->code_group;