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

如何在Django中创建两类不同权限的后台管理用户?

Django 自动创建超级用户与维护用户的实现方案

核心思路

  1. 超级用户:复用Django自带User模型的is_superuser属性,通过post_migrate信号在系统初始化(执行migrate)时自动创建,省去手动执行createsuperuser命令的步骤。
  2. 维护用户:先创建专属权限组(如Maintenance),给组分配系统维护相关权限,再创建属于该组的用户,同样通过信号自动完成,确保用户拥有指定维护权限且能登录后台。
  3. 防重复创建:每次触发信号时先检查用户/组是否存在,避免重复生成。

具体实现代码

1. 创建信号处理文件

在你的Django项目任意app下(比如myapp)新建signals.py文件,写入以下代码:

from django.db.models.signals import post_migrate
from django.dispatch import receiver
from django.contrib.auth.models import User, Group, Permission
import os

# -------------------------- 创建超级用户 --------------------------
@receiver(post_migrate)
def auto_create_superuser(sender, **kwargs):
    # 仅在指定app的migrate完成后触发(替换成你的app名称,比如'myapp')
    if kwargs['app_config'].name != 'myapp':
        return
    
    # 从环境变量读取配置,避免硬编码(推荐),无环境变量则用默认值
    su_username = os.getenv('SU_USERNAME', 'admin')
    su_email = os.getenv('SU_EMAIL', 'admin@example.com')
    su_password = os.getenv('SU_PASSWORD', 'Admin@123')

    if not User.objects.filter(username=su_username).exists():
        User.objects.create_superuser(
            username=su_username,
            email=su_email,
            password=su_password
        )
        print(f"超级用户 {su_username} 创建成功")

# -------------------------- 创建维护用户与权限组 --------------------------
@receiver(post_migrate)
def auto_create_maintenance_user(sender, **kwargs):
    if kwargs['app_config'].name != 'myapp':
        return
    
    # 1. 创建维护权限组
    maintenance_group, _ = Group.objects.get_or_create(name='Maintenance')

    # 2. 给组分配维护相关权限(根据你的需求调整)
    # 权限的codename可从Django后台的"权限"列表中查看
    required_permissions = [
        'view_user',          # 查看用户列表
        'view_logentry',      # 查看操作日志
        'change_site',        # 修改站点设置
        'view_permission',    # 查看权限列表
        # 可添加自定义app权限,比如'myapp_view_maintenance_log'
    ]

    for perm_codename in required_permissions:
        try:
            perm = Permission.objects.get(codename=perm_codename)
            maintenance_group.permissions.add(perm)
        except Permission.DoesNotExist:
            print(f"权限 {perm_codename} 不存在,跳过分配")

    # 3. 创建维护用户
    mu_username = os.getenv('MU_USERNAME', 'maintainer')
    mu_email = os.getenv('MU_EMAIL', 'maintainer@example.com')
    mu_password = os.getenv('MU_PASSWORD', 'Maintain@123')

    if not User.objects.filter(username=mu_username).exists():
        maintenance_user = User.objects.create_user(
            username=mu_username,
            email=mu_email,
            password=mu_password,
            is_staff=True  # 必须设为True才能登录Django后台
        )
        maintenance_user.groups.add(maintenance_group)
        maintenance_user.save()
        print(f"维护用户 {mu_username} 创建成功")

2. 注册信号

打开该app下的apps.py文件,修改ready()方法导入信号:

from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        # 导入信号模块,让Django加载信号
        import myapp.signals

3. 配置环境变量(可选但推荐)

在项目根目录新建.env文件,存放敏感信息:

SU_USERNAME=admin
SU_EMAIL=admin@yourdomain.com
SU_PASSWORD=YourStrongSuperPassword!
MU_USERNAME=maintainer
MU_EMAIL=maintainer@yourdomain.com
MU_PASSWORD=YourStrongMaintainPassword!

记得在settings.py中加载环境变量(需安装python-dotenv包:pip install python-dotenv):

from dotenv import load_dotenv
import os

load_dotenv()  # 加载.env文件

运行验证

执行以下命令完成数据库迁移,信号会自动触发创建用户:

python manage.py migrate

之后登录Django后台(/admin),分别用超级用户和维护用户登录,验证权限是否符合预期。


注意事项

  • 维护用户必须设置is_staff=True,否则无法登录后台。
  • 权限列表可根据实际维护需求增减,比如不需要修改站点设置就去掉change_site。
  • 生产环境禁止硬编码密码,务必使用环境变量或安全配置方式。
  • 修改用户信息直接在Django后台操作即可,无需重新执行migrate。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:03:22