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

Django管理员后台登录权限问题咨询:is_superuser为true但is_staff为false时无法登录能否自定义实现登录?

Django管理员后台登录权限问题咨询:is_superuser为true但is_staff为false时无法登录能否自定义实现登录?

嗨,这个问题我之前也踩过坑!Django默认的管理员后台规则是:必须同时满足is_active=True和is_staff=True才能登录,哪怕你是超级用户(is_superuser=True)也绕不开这个限制——因为is_staff是允许进入后台的基础门槛,超级用户权限只是后台内的最高操作权限,得先能进去后台才能生效。

不过当然可以自定义实现超级用户跳过is_staff限制登录后台,这里给你两种实用的方法:

方法一:自定义AdminSite(最直接的后台权限控制)

你可以创建一个自定义的AdminSite类,重写它的权限判断逻辑,让超级用户即使is_staff=False也能进入后台:

首先在你的app里的admin.py中添加以下代码:

from django.contrib.admin import AdminSite

class CustomAdminSite(AdminSite):
    def has_permission(self, request):
        # 修改权限判断规则:活跃用户 + (staff身份 或 超级用户身份)
        return request.user.is_active and (request.user.is_staff or request.user.is_superuser)

# 实例化自定义的后台站点
custom_admin_site = CustomAdminSite(name='custom_admin')

# 把你需要在后台管理的模型注册到这个自定义站点上
# 比如你有个叫Article的模型,就这么写:
# from .models import Article
# custom_admin_site.register(Article)

然后去项目根目录的urls.py里,把默认的admin路由替换成自定义的:

from django.urls import path
from your_app.admin import custom_admin_site  # 替换成你的app名称

urlpatterns = [
    # 注释掉原来的path('admin/', admin.site.urls)
    path('admin/', custom_admin_site.urls),
]

方法二:自定义认证后端(从登录验证层面调整)

如果需要更灵活的登录逻辑,你可以写一个自定义的认证后端,在登录时直接判断超级用户的情况:

先在你的app里创建一个backends.py文件,写入以下代码:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

User = get_user_model()

class SuperuserLoginBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(username=username)
            # 验证密码,并且允许staff或超级用户登录
            if user.check_password(password) and (user.is_staff or user.is_superuser):
                return user
        except User.DoesNotExist:
            # 用户名不存在时返回None,交给其他后端处理
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

然后在项目的settings.py里配置这个认证后端:

AUTHENTICATION_BACKENDS = [
    'your_app.backends.SuperuserLoginBackend',  # 替换成你的app路径
    'django.contrib.auth.backends.ModelBackend',  # 保留默认后端作为 fallback
]

注意事项

不过要提醒一下,这样修改会打破Django原本的权限设计逻辑——is_staff字段本来就是用来明确区分「哪些用户能进入后台」的,自定义后要确保你清楚带来的权限影响,比如原本不想让某些超级用户访问后台的话,现在他们就有权限了,记得做好后续的权限管控哦。

备注:内容来源于stack exchange,提问作者user24196275

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:24:52