如何限制django中超级用户的数量

时间:2016-03-27 08:50:42

标签: python django superuser

在我的django项目中,我希望只有一个超级用户,而且 python manage.py createsuperuser

可以创建更多超级用户

有可能吗?如果可能的话怎么办?

2 个答案:

答案 0 :(得分:1)

任何能够运行python manage.py createsuperuser的人都应该能够运行python manage.py dbshell并在数据库中手动创建超级用户。所以,无论如何,这应该是一个值得信赖的人。

如果只有受信任的人可以添加超级用户,那么告诉他们不要创建多个超级用户(虽然我想知道限制只有一个超级用户的目的是什么)。

但是,如果您想阻止python manage.py createsuperuser错误地创建多个超级用户,则可以override this command

from django.contrib.auth.management.commands import createsuperuser
from django.core.management.base import CommandError

class Command(createsuperuser.Command):
    def handle(self, *args, **options):
        if self.UserModel.objects.filter(is_superuser=True).exists():
            raise CommandError("There is no room for two, go your way!")
        super().handle(*args, **options)

请注意,这不会阻止用户将用户设置为django管理界面的超级用户。

如果您想完全无法创建两个超级用户,可以直接在数据库级别添加约束。

另一种方法是将django.contrib.auth.models.User子类化并定义:

SUPERUSER_ID = 1  # or whatever

@property
def is_superuser(self):
    return self.id == self.SUPERUSER_ID

答案 1 :(得分:1)

您可以编写脚本来检查超级用户的数量。假设你想要10个超级用户,那么每次创建一个超级用户时都会计算它是否超过10,并相应地给出错误/成功消息。

您可以按如下方式计算超级用户数:

    from django.contrib.auth.models import User
    from django.http import HttpResponse

    user_obj = User.objects.all()
    c = 0
    for i in user_obj:
        if i.is_superuser():
            c += 1

    if c > 10:
        return HttpResponse('Cannot add anymore superusers')
    else:
        new_user  = User.objects.create_user(username = name, password = password)

当然,你必须制作一个表格来接受用户名和密码,但我已经给出了基本的想法 您还可以使用python的threading库来实现异步