2016-03-27 2 views
1

Dans mon projet django, je veux qu'il n'y aura qu'un seul super-utilisateur et pas plus d'utilisateurs de super peuvent être créer par python manage.py createsuperusercomment limiter le nombre de super-utilisateur dans django

Est-il possible ? Si possible comment?

+0

Qui a accès à la console? Et 'createsuperuser' est _not_ le seul moyen de créer un super-utilisateur. – Selcuk

+0

Quelle est l'intention réelle ici? De qui voulez-vous protéger? Notez que vous pouvez créer un super-utilisateur à partir de 'manage.py shell', ou directement dans la base de données. – Koterpillar

Répondre

1

Toute personne capable d'exécuter python manage.py createsuperuser devrait pouvoir exécuter python manage.py dbshell et créer le super utilisateur manuellement dans la base de données. Donc, cela devrait être une personne de confiance de toute façon.

Si seules les personnes de confiance peuvent ajouter des superutilisateurs, dites-leur simplement de ne pas créer plusieurs super-utilisateurs (bien que je me demande quel est le but de limiter à un seul super-utilisateur).

Cependant, si vous voulez éviter de créer plus d'un super-utilisateur par erreur avec python manage.py createsuperuser, vous pouvez 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) 

Notez que cela n'empêchera pas de fixer un utilisateur comme étant un super-utilisateur de django interface d'administration.

Si vous voulez complètement rendre impossible la création de deux super-utilisateurs, vous pouvez directement ajouter la contrainte au niveau de la base de données.

Une autre façon de le faire serait de sous-classe django.contrib.auth.models.User et définir:

SUPERUSER_ID = 1 # or whatever 

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

Vous pouvez écrire un script pour vérifier le numéro de super-utilisateur. Supposons que vous vouliez 10 superutilisateurs, chaque fois qu'un superutilisateur est créé, comptez s'il compte plus de 10 ou pas et donnez un message d'erreur/succès en conséquence.

Vous pouvez compter superutilisateurs comme suit:

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) 

Bien sûr, vous devez faire un formulaire pour accepter le nom d'utilisateur et mot de passe, mais j'ai donné l'idée de base.
Vous pouvez également utiliser la bibliothèque threading de python pour rendre les choses asynchrones

+0

'User.objects.filter (is_superuser = True) .count()' serait beaucoup plus efficace. Sauf s'il existe un modèle utilisateur personnalisé qui ne stocke pas 'is_superuser'. Dans ce cas, cela semblerait un peu plus pythonique: 'len ([x pour x dans User.objects.all() si x.is_superuser])'. –