fix: [users] 슈퍼관리자 보호 기능 복원 라우트 수정

- routes/api.php: 8개 엔티티의 restore 라우트를 super.admin 미들웨어 밖으로 이동
  - tenants, departments, users, menus, boards
  - pm/projects, pm/tasks, pm/issues
- UserService.canAccessUser(): withTrashed() 적용하여 soft-deleted 사용자 권한 체크 가능
- UserPermissionService.canModifyUser(): withTrashed() 적용 (일관성 유지)

권한 정책:
- 복원 (Restore): 일반관리자 가능
- 영구삭제 (Force Delete): 슈퍼관리자 전용

버그 수정:
- 302 Found 에러 해결 (미들웨어 블로킹)
- soft-deleted 사용자 복원 시 권한 체크 실패 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-01 00:13:12 +09:00
parent bbf34e9f3f
commit b39e8b5f2c
14 changed files with 376 additions and 53 deletions

View File

@@ -691,21 +691,49 @@ public function hasPermission(int $userId, int $menuId, string $permissionType,
->exists();
}
/**
* 대상 사용자가 슈퍼관리자인지 검증 (일반관리자는 슈퍼관리자 수정 불가)
*
* @param int $targetUserId 대상 사용자 ID
* @return bool true면 수정 가능, false면 수정 불가
*/
public function canModifyUser(int $targetUserId): bool
{
// withTrashed()를 사용하여 일관성 유지
$targetUser = User::withTrashed()->find($targetUserId);
$currentUser = auth()->user();
// 대상 사용자가 슈퍼관리자이고 현재 사용자가 슈퍼관리자가 아니면 수정 불가
if ($targetUser?->is_super_admin && ! $currentUser?->is_super_admin) {
return false;
}
return true;
}
/**
* 테넌트별 사용자 목록 조회 (권한 개수 포함)
* 일반관리자는 슈퍼관리자가 목록에서 제외됨
*
* @param int $tenantId 테넌트 ID
* @return \Illuminate\Support\Collection 사용자 목록
*/
public function getUsersByTenant(int $tenantId): \Illuminate\Support\Collection
{
$users = User::whereHas('tenants', function ($query) use ($tenantId) {
$currentUser = auth()->user();
$query = User::whereHas('tenants', function ($query) use ($tenantId) {
$query->where('tenants.id', $tenantId)
->where('user_tenants.is_active', true);
})
->where('is_active', true)
->orderBy('name')
->get();
->where('is_active', true);
// 일반관리자는 슈퍼관리자를 볼 수 없음
if (! $currentUser?->is_super_admin) {
$query->where('is_super_admin', false);
}
$users = $query->orderBy('name')->get();
// 각 사용자별 권한 개수 계산
$now = now();