web-dev-qa-db-fra.com

Comment utiliser les groupes et les autorisations Django?

Je comprends les trucs de base de l'utilisateur. Je connais l'authentification, la connexion, la création de comptes, etc. Mais maintenant je veux travailler sur les groupes et les autorisations.

Où est la documentation pour Django groups/permissions? Ce n'est pas ça: http://docs.djangoproject.com/en/dev/topics/auth/

79
TIMEX

Je suppose que la première question que vous devez poser est de quelles autorisations avez-vous besoin et de quel type. Par quel type, je veux dire voulez-vous au niveau du modèle ou de l'objet. Pour clarifier la différence, disons que vous avez un modèle de voiture. Si vous souhaitez accorder des autorisations sur toutes les voitures, le niveau du modèle est approprié, mais si vous souhaitez accorder des autorisations par voiture, vous voulez le niveau de l'objet. Vous pouvez avoir besoin des deux, et ce n'est pas un problème comme nous le verrons.

Pour les autorisations de modèle, Django les gère pour vous ... principalement. Pour chaque modèle Django créera des autorisations sous la forme 'appname.permissionname_modelname'. Si vous avoir une application appelée 'drivers' avec le modèle Car alors une permission serait 'drivers.delete_car'. Les permissions que Django crée automatiquement seront créées, modifiées et supprimées. Pour une raison étrange ils ont décidé de ne pas inclure les autorisations de lecture de CRUD, vous devrez le faire vous-même. Notez que Django a décidé de changer la "mise à jour" de CRUD en "changer" pour une raison quelconque. Pour ajouter plus d'autorisations à un modèle, par exemple des autorisations de lecture, vous utilisez la classe Meta:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

Notez que les autorisations sont un ensemble de tuples, où les éléments Tuple sont l'autorisation comme décrit ci-dessus et une description de cette autorisation. Vous n'êtes pas obligé de suivre la convention permname_modelname mais je m'en tiens généralement à elle.

Enfin, pour vérifier les autorisations, vous pouvez utiliser has_perm:

obj.has_perm( 'drivers.read_car' )

Où obj est une instance d'utilisateur ou de groupe. Je pense qu'il est plus simple d'écrire une fonction pour cela:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__) ):
            return False
    return True

Lorsque l'entité est l'objet sur lequel vérifier les autorisations (groupe ou utilisateur), le modèle est l'instance d'un modèle, perms est une liste d'autorisations sous forme de chaînes à vérifier (par exemple ['lire', 'changer']), et l'application est le nom de l'application sous forme de chaîne. Pour faire la même vérification que has_perm ci-dessus, vous appelleriez quelque chose comme ceci:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

Si vous devez utiliser des autorisations d'objet ou de ligne (elles signifient la même chose), alors Django ne peut pas vraiment vous aider par lui-même. La bonne chose est que vous pouvez utiliser à la fois les autorisations de modèle et d'objet Si vous voulez des autorisations d'objet, vous devrez soit écrire le vôtre (si vous utilisez 1.2+) ou trouver un projet que quelqu'un d'autre a écrit, celui que j'aime est Django-objectpermissions des heures de lavage.

117
Alex Kuhl