authorize('users.view'); $users = User::with('userPermissions')->orderBy('id')->get(); $roleLabels = PermissionService::roleLabels(); return view('admin.users.index', compact('users', 'roleLabels')); } public function edit(User $user): View { $this->authorize('users.manage'); abort_unless(Auth::user()->canManage($user), 403, 'Недостаточно прав для управления этим пользователем.'); $user->load('userPermissions'); $permissions = PermissionService::all(); $roleLabels = PermissionService::roleLabels(); $roleDefaults = $user->role ? PermissionService::roleDefaults($user->role) : []; $overrides = $user->userPermissions->keyBy('permission'); return view('admin.users.edit', compact('user', 'permissions', 'roleLabels', 'roleDefaults', 'overrides')); } public function update(Request $request, User $user): RedirectResponse { $this->authorize('users.manage'); abort_unless(Auth::user()->canManage($user), 403, 'Недостаточно прав для управления этим пользователем.'); $request->validate([ 'role' => 'nullable|in:superadmin,admin,editor,viewer', 'permissions' => 'nullable|array', 'permissions.*' => 'in:allow,deny', ]); // superadmin не может снять роль superadmin сам у себя, если он единственный if ($user->role === 'superadmin' && $request->input('role') !== 'superadmin') { $superCount = User::where('role', 'superadmin')->count(); abort_if($superCount <= 1, 422, 'Нельзя снять роль у единственного суперадминистратора.'); } // Только superadmin может назначать роль superadmin или admin $newRole = $request->input('role'); if (in_array($newRole, ['superadmin', 'admin']) && Auth::user()->role !== 'superadmin') { abort(403, 'Только суперадминистратор может назначать эту роль.'); } $user->update([ 'role' => $newRole ?: null, 'is_admin' => ! empty($newRole), // синхронизируем legacy-флаг ]); // Перезаписываем индивидуальные overrides UserPermission::where('user_id', $user->id)->delete(); $allKeys = PermissionService::keys(); foreach ($request->input('permissions', []) as $key => $action) { if (! in_array($key, $allKeys, true)) { continue; } if (! in_array($action, ['allow', 'deny'], true)) { continue; } UserPermission::create([ 'user_id' => $user->id, 'permission' => $key, 'action' => $action, ]); } return redirect()->route('admin.users.index') ->with('success', 'Пользователь «'.$user->name.'» обновлён.'); } public function destroy(User $user): RedirectResponse { $this->authorize('users.manage'); abort_unless(Auth::user()->canManage($user), 403); abort_if($user->id === Auth::id(), 422, 'Нельзя удалить самого себя.'); $user->delete(); return redirect()->route('admin.users.index') ->with('success', 'Пользователь удалён.'); } }