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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user