You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何限制管理员删除:防删自身及管理员数量归零

Laravel中管理员删除功能的权限控制实现

一、后端数据展示层优化(隐藏无权限删除按钮)

先修改apiAdmins方法,在生成操作按钮时判断两个核心条件,只有满足时才显示删除按钮,提升用户体验:

public function apiAdmins()
{
    $admins = User::all();
    $currentUserId = auth()->id();
    $adminCount = $admins->count();

    return Datatables::of($admins)
        ->addColumn('action', function($admin) use ($currentUserId, $adminCount) {
            // 仅当待删除账号不是当前登录用户,且管理员总数>1时,显示删除按钮
            if ($admin->id !== $currentUserId && $adminCount > 1) {
                return '<a onclick="deleteData('. $admin->id .')" class="btn btn-danger btn-xs">
                        <i class="glyphicon glyphicon-trash"></i> Delete </a>';
            }
            // 不满足条件时返回空占位
            return '';
        })
        ->rawColumns(['action'])->make(true);
}

二、后端删除控制器核心校验(防止前端绕过)

找到管理员删除对应的destroy方法,添加严格的权限校验——这是安全控制的核心,必须实现:

public function destroy($id)
{
    $currentUser = auth()->user();
    $targetAdmin = User::findOrFail($id);
    $adminCount = User::count();

    // 校验1:禁止删除当前登录的自身账号
    if ($targetAdmin->id === $currentUser->id) {
        return response()->json(['message' => '无法删除当前登录的管理员账号'], 403);
    }

    // 校验2:禁止删除到管理员数量为0
    if ($adminCount <= 1) {
        return response()->json(['message' => '必须保留至少一名管理员'], 403);
    }

    // 校验通过,执行删除
    $targetAdmin->delete();
    return response()->json(['message' => '管理员删除成功']);
}

三、前端错误提示优化

修改deleteData函数,适配后端返回的错误信息,让用户能清晰知道操作失败原因:

function deleteData(id) {
    var csrf_token = $('meta[name="csrf-token"]').attr('content');
    swal({
        title: '确认删除?',
        text: "此操作不可撤销!",
        type: 'warning',
        showCancelButton: true,
        cancelButtonColor: '#d33',
        confirmButtonColor: '#3085d6',
        confirmButtonText: '确认删除!',
        cancelButtonText: '取消',
    }).then(function () {
        $.ajax({
            url : "{{ url('admins') }}" + '/' + id,
            type : "POST",
            data : {'_method' : 'DELETE', '_token' : csrf_token},
            success : function(data) {
                table.ajax.reload();
                swal({
                    title: '删除成功',
                    text: data.message,
                    type: 'success',
                    timer: '1500'
                })
            },
            error : function (xhr) {
                var errorMsg = xhr.responseJSON?.message || '删除失败,请稍后重试';
                swal({
                    title: '操作失败',
                    text: errorMsg,
                    type: 'error',
                    timer: '1500'
                })
            }
        });
    });
}

注意事项

  • 前端隐藏按钮只是体验优化,必须依赖后端校验阻止非法操作,因为前端逻辑可以被绕过
  • 两个校验条件需要同时在后端实现,确保数据安全

内容的提问来源于stack exchange,提问作者Cassey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:02:08