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

Posted

技术标签:

【中文标题】如何限制django中超级用户的数量【英文标题】:how to limit number of super user in django 【发布时间】:2016-07-14 17:17:42 【问题描述】:

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

创建更多超级用户

有可能吗?如果可能怎么做?

【问题讨论】:

谁可以访问控制台?而createsuperuser不是创建超级用户的唯一方法。 这里的实际意图是什么?你想保护谁?请注意,您可以在 manage.py shell 中创建超级用户,也可以直接在数据库中创建。 【参考方案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

【讨论】:

【参考方案2】:

您可以编写一个脚本来检查超级用户的数量。假设您想要 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 库来使事情异步

【讨论】:

User.objects.filter(is_superuser=True).count() 会更有效率。除非有不存储is_superuser 的自定义用户模型。在这种情况下,这看起来会更 Pythonic:len([x for x in User.objects.all() if x.is_superuser]).

以上是关于如何限制django中超级用户的数量的主要内容,如果未能解决你的问题,请参考以下文章

django 设置超级用户时不可以输入密码

在 Elastic Beanstalk Postgresql 中创建 Django 超级用户

如果我通过 git 部署了 Django 应用程序,如何创建超级用户?

除超级用户外,如何使字段只在django admin中读取?

django1.9.5怎么建立超级用户

django1.9.5怎么建立超级用户?