Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Empecher la création de superutilisateur sur django

0 votes

Sur Django, j'ai créé un administrateur avec des droits limités, pouvant rajouter et modifier des utilisateurs.

Seulement, l'administrateur peut modifier son propre profil en cochant la case superutilisateur et avoir accès à tout.
Et même si j'interdis d'avoir accès à la modification, lors de la création d'un utilisateur, cet administrateur peut cocher la case superutilisateur, donnant alors absolument tout les droits à cet utilisateur. Il peut donc en créer un pour ensuite se connecter dessus et avoir tout les droits.

Ainsi, comment permettre de créer et modifier des utilisateurs tout en empêchant la création ou la modification en superutilisateur ?

demandé 8-Jun-2016 par Andy (314 points)

3 Réponses

0 votes

la doc dit tout en bas de la page :

Notez également que si vous voulez qu’un utilisateur puisse créer
d’autres utilisateurs dans le site d’administration de Django, vous
devez lui attribuer la permission d’ajouter des utilisateurs et de
modifier des utilisateurs (c’est-à-dire les permissions « Can add user
» et « Can change user »).

répondu 8-Jun-2016 par foxmask (2,670 points)

Oui j'ai bien mit les permissions add user et change user. Mais celui qui a ses permissions peut créer un superutilisateur. Ce que je souhaite éviter.

ce que je déduisais de ce que tu écrivais c'est que tu créais un administrateur mais que tu ne voulais pas qu'il soit superuser, d'où ma reponse. Mais j'ai dû rater quelque chose.
Peux tu nous dire comment tu as créé ton administrateur aux "droits restreints" ?

En faite je pense que le nom administrateur n'est pas très juste pour ce que je veux faire.

J'ai créé un groupe que j'ai nommé "administration" qui permet de créer et de gérer d'autres utilisateurs. Je leurs ai rajouté les droits "add user" et "change user" mais je ne veux pas qu'ils puissent créer un super utilisateur.
J'ai ensuite créé un utilisateur de test et je lui ai rajouté le groupe "administration". Je me connecte dessus et il peut créer d'autres utilisateurs.
Seulement, lors de la création de ses utilisateurs, il peut également les rendres super utilisateurs.
Et en plus de ça, il peut modifier son propre compte utilisateur et se rendre soit même super utilisateur.

+1 vote

Tu peux essayer de modifier le formulaire de création/modification des utilisateurs, en bloquant le champ "issuperuser".
Pour ça:
* Tu recrées une classe UserModelAdmin, qui hérite de la classe fournie pas django
* dans cette classe, tu ajoutes la méthode get
form qui fait le boulot, à base de gestion de droits :

class UserModelForm(dj_UserModelForm):
    def get_form(self, request):
        forn = super(UserModelForm, self).fet_form(request)
        if request.user.is_superuser:
            # Tu lui donnes tous les droits
            return form
        # Suppression / mise à jour du champ...
        # ...
        return form

Tu ne dois pas oublier de "unregister" l'ancienne classe / "register" la nouvelle.

Courage !

répondu 8-Jun-2016 par frague (484 points)

je pense qu'il ne veut pas coder une seule ligne mais juste gerer des utilisateurs ;)

Qu'es-ce que tu veux dire par "unregister/register" ?
Quel ligne de ton code bloque le is_superuser ?
Et une fois le code copier dans le fichier models.py, le model django de User seras remplacé par le nouveau usermodel ?

+1 vote

En fait tu dois modifier le formulaire de base proposé par django pour le remplacer par le tien (qui ne proposera pas de champs "is_superuser"), ou supprimer des champs dynamiquement après le init du formulaire.

Pour le unregister / register;

admin.site.unregister(auth_models.User)
admin site.register(auth_models.User, MyUserModelAdmin)

That'all folks... (oublie pas de checker que le authmodel.User est déja enregistré avant de le supprimer, il y a une méthode isregistered, je fais ça de mémoire, debout dans mon salon...

Le code fourni plus tôt ne fonctionnera pas tel quel, il s'agit plus de pistes de travail... Lis bien la doc de l'admin django, elle est assez claire là dessus.

répondu 9-Jun-2016 par frague (484 points)

+1. Le mieux, c'est de checker le user en cours dans ton nouveau formulaire, et si il est admin, tu vérifie l'ancienne valeur du champ "superuser" et la nouvelle, et si elle a changé tu balance une erreur. Plus d'infos sur l'overriding de forms en DJango : https://stackoverflow.com/questions/10040442/override-a-form-in-django-admin

...