2016-03-27 4 views
1

В моем Джанго проекте, я хочу, что там будет только один супер пользователь и не более супер пользователи не могут создавать с помощью питона manage.py createsuperuserкак ограничить количество суперпользователя в Джанго

Можно ? Если возможно, как?

+0

У кого есть доступ к консоли? И 'creationuperuser' - это _not_ единственный способ создать суперпользователя. – Selcuk

+0

Каково фактическое намерение здесь? С кого вы хотите защитить? Обратите внимание, что вы можете создать суперпользователя из 'manage.py shell' или непосредственно в базе данных. – Koterpillar

ответ

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.contrib.auth.models.User и определить:

SUPERUSER_ID = 1 # or whatever 

@property 
def is_superuser(self): 
    return self.id == self.SUPERUSER_ID 
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) 

, конечно, вы должны сделать форму, чтобы принять имя пользователя и пароль, но я дал основную идею.
Вы также можете использовать библиотеку threading python, чтобы сделать вещи async

+0

'User.objects.filter (is_superuser = True) .count()' будет намного более эффективным. Если не существует пользовательской модели пользователя, которая не хранит 'is_superuser'. В этом случае это выглядело бы немного более pythonic: 'len ([x for x в User.objects.all(), если x.is_superuser])'. –

Смежные вопросы