fix:공통코드 슈퍼관리자 권한 우회 추가

슈퍼관리자는 다른 테넌트/글로벌 코드 수정·토글·삭제 가능

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-29 13:04:37 +09:00
parent 60ab03601f
commit 09323aaa4c

View File

@@ -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;