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

如何禁止Staff与Admin用户编辑Superuser的属性

解决方案

场景1:完全禁止Staff和Admin篡改任何Superuser的属性

在现有代码基础上,增加对目标用户是否为Superuser的判断,直接阻止非超级管理员修改超级管理员的敏感字段,甚至可以彻底禁用所有编辑权限:

修改后的Admin代码

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    current_user = request.user
    disabled_fields = set()

    # 仅对非超级管理员做限制
    if not current_user.is_superuser:
        # 编辑自身时禁用指定字段
        if obj is not None and obj == current_user:
            disabled_fields |= {'staff', 'admin', 'user_permissions'}
        # 编辑超级管理员时,禁用所有敏感字段
        elif obj is not None and obj.is_superuser:
            # 可根据需求添加更多要禁用的字段
            disabled_fields |= {'staff', 'admin', 'user_permissions', 'is_superuser'}
            # 若要完全禁止修改Superuser,可直接禁用所有字段
            # for field in form.base_fields:
            #     form.base_fields[field].disabled = True

    # 应用禁用设置
    for f in disabled_fields:
        if f in form.base_fields:
            form.base_fields[f].disabled = True

    return form

额外强化:从权限层面彻底阻止编辑

还可以重写has_change_permission方法,直接让Staff/Admin用户看不到Superuser的编辑入口:

def has_change_permission(self, request, obj=None):
    # 非超级管理员无权修改超级管理员
    if obj is not None and obj.is_superuser and not request.user.is_superuser:
        return False
    return super().has_change_permission(request, obj)

场景2:仅允许编辑除自身及Superuser之外的用户的is_staff与is_admin字段

默认禁用非超级管理员修改is_staff和is_admin的权限,仅当编辑对象是「非自身、非Superuser」的普通用户时,才放开这两个字段的编辑权限:

修改后的Admin代码

def get_form(self, request, obj=None, **kwargs):
    form = super().get_form(request, obj, **kwargs)
    current_user = request.user

    # 仅对非超级管理员做限制
    if not current_user.is_superuser:
        # 默认禁用staff和admin字段
        disabled_fields = {'staff', 'admin'}
        
        # 仅当编辑对象不是自己、也不是超级管理员时,启用这两个字段
        if obj is not None and obj != current_user and not obj.is_superuser:
            disabled_fields -= {'staff', 'admin'}
        
        # 编辑自身时额外禁用user_permissions
        if obj is not None and obj == current_user:
            disabled_fields.add('user_permissions')

        # 应用禁用设置
        for f in disabled_fields:
            if f in form.base_fields:
                form.base_fields[f].disabled = True

    return form

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:56