2011-01-24 1 views

Répondre

102

Je suppose que la première question que vous devez poser est de savoir quelles permissions avez-vous besoin et quel genre. Par quel genre, je veux dire voulez-vous le niveau Model ou Object? Pour clarifier la différence disons que vous avez un modèle de voiture. Si vous souhaitez accorder des autorisations sur toutes les voitures, alors le niveau Modèle est approprié, mais si vous souhaitez accorder des autorisations par voiture, vous devez définir 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 permissions Model, Django les gère pour vous ... pour la plupart. Pour chaque modèle, Django créera des permissions au format 'appname.permissionname_modelname'. Si vous avez une application appelée 'drivers' avec le modèle Car, une permission serait 'drivers.delete_car'. Les autorisations 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 pour 'changer' pour une raison quelconque. Pour ajouter d'autres autorisations à un modèle, par exemple lire les autorisations, vous utilisez la classe Meta:

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

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

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

obj.has_perm('drivers.read_car') 

Où obj est un utilisateur ou groupe instance. 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.__name__)): 
      return False 
    return True 

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

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

Si vous devez utiliser un objet ou autorisations ligne (ils signifient la même chose), alors Django ne peut vraiment vous aider par lui-même . La bonne chose est que vous pouvez utiliser les autorisations de modèle et d'objet côte à côte. Si vous voulez des autorisations d'objet, vous devrez soit write your own (si vous utilisez 1.2+) ou trouver un projet que quelqu'un d'autre a écrit, un que j'aime est django-objectpermissions de washingtontimes.

+21

Ceci est une excellente réponse pour les permissions, mais touche à peine les groupes et comment ils fonctionnent dans Django? – Simon

+3

Il n'y a pas grand-chose pour les groupes, ils sont surtout juste pour regrouper les utilisateurs afin d'appliquer des permissions, un peu comme les groupes d'utilisateurs Linux. Vous donnez une permission à un groupe et il s'étend à tous les membres de ce groupe. La documentation dit tout vraiment: https://docs.djangoproject.com/en/dev/topics/auth/default/#groups. –

+0

On dirait que Django Advent est parti, il y a une version de l'article sur l'écriture de vos propres permissions d'objet sur Github: https://github.com/djangoadvent/djangoadvent-articles/blob/master/1.2/06_object-permissions.rst –

Questions connexes