2016-03-27 18 views
1

Anzahl von Super-User begrenzen, will ich, dass es nur eine Super-User und nicht mehr Super User von Python manage.py createsuperuserwie in meinem django Projekt in django

Ist es möglich, erstellen werden können ? Wenn möglich wie?

+0

Wer hat Zugriff auf die Konsole? Und 'createsuperuser' ist _nicht_ die einzige Möglichkeit, einen Superuser zu erstellen. – Selcuk

+0

Was ist die eigentliche Absicht hier? Vor wem möchten Sie schützen? Beachten Sie, dass Sie einen Superuser aus 'manage.py shell' oder direkt in der Datenbank erstellen können. – Koterpillar

Antwort

1

Jede Person, die in der Lage ist, python manage.py createsuperuser auszuführen, sollte python manage.py dbshell ausführen und den Superbenutzer manuell in der Datenbank erstellen können. Also, das sollte sowieso eine vertrauenswürdige Person sein.

Wenn nur vertrauenswürdige Personen Superuser hinzufügen können, dann sagen Sie ihnen, dass sie nicht mehrere Superuser erstellen dürfen (obwohl ich mich frage, welchen Zweck es hat, auf nur einen Superuser zu beschränken).

Wenn Sie jedoch mit python manage.py createsuperuser von der Erstellung mehr als ein Super-User versehentlich verhindern möchten, können Sie 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) 

Beachten Sie, dass dies nicht ein Benutzer Einstellung als ein Super-User von django verhindern Admin-Schnittstelle.

Wenn Sie es vollständig unmöglich machen möchten, zwei Superuser zu erstellen, können Sie die Einschränkung direkt auf der Datenbankebene hinzufügen.

Eine andere Möglichkeit, es zu tun wäre django.contrib.auth.models.User und definieren Unterklasse:

SUPERUSER_ID = 1 # or whatever 

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

Sie ein Skript Anzahl von Super-User zu überprüfen, schreiben kann. Angenommen, Sie möchten 10 Superuser, dann jedes Mal, wenn ein Superuser erstellt wird, zählen Sie, wenn es mehr als 10 oder nicht ist, und geben Sie entsprechend Fehler/Erfolgsmeldung.

können Sie Superuser zählen wie folgt:

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) 

natürlich müssen Sie ein Formular machen Benutzernamen und ein Passwort zu übernehmen, aber ich habe die Grundidee gegeben.
Sie können auch Pythons threading Bibliothek verwenden, um Dinge async zu machen

+0

'User.objects.filter (is_superuser = True) .count()' wäre viel effizienter. Es sei denn, es gibt ein benutzerdefiniertes Benutzermodell, das 'is_superuser' nicht speichert. In diesem Fall würde das etwas pythonischer aussehen: 'len ([x für x in User.objects.all() falls x.is_superuser])'. –