2011-01-24 15 views

risposta

102

Suppongo che la prima domanda da porsi sia quali sono i permessi necessari e di quale tipo. In base a che tipo, voglio dire a livello di modello o di oggetto. Per chiarire la differenza, diciamo che hai un modello di auto. Se si desidera concedere le autorizzazioni a tutte le auto, il livello del modello è appropriato, ma se si desidera concedere le autorizzazioni su una base per auto, si desidera il livello oggetto. Potresti aver bisogno di entrambi e questo non è un problema, come vedremo.

Per i permessi del modello, Django gestisce questi per voi ... per lo più. Per ogni modello Django creerà i permessi nella forma 'appname.permissionname_modelname'. Se hai un'app chiamata "driver" con il modello Car, un'autorizzazione sarebbe "drivers.delete_car". Le autorizzazioni create automaticamente da Django saranno create, modificate ed eliminate. Per qualche strana ragione hanno deciso di non includere i permessi di lettura da CRUD, dovrete farlo da soli. Nota che Django ha deciso di cambiare "aggiornamento" di CRUD in "modifica" per qualche motivo. Per aggiungere ulteriori autorizzazioni per un modello, per esempio i permessi di lettura, si utilizza la classe Meta:

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

noti che le autorizzazioni è un insieme di tuple, dove gli elementi tuple sono il permesso come sopra descritto e una descrizione di tale autorizzazione . Non è necessario seguire la convenzione permname_modelname, ma di solito ci rimango.

Infine, per controllare le autorizzazioni, è possibile utilizzare has_perm:

obj.has_perm('drivers.read_car') 

Dove obj è un utente o istanza del gruppo. Penso che sia più semplice scrivere una funzione per questo:

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 

Dove entità è l'oggetto di verificare le autorizzazioni su (di gruppo o utente), il modello è l'istanza di un modello, permanenti è un elenco di autorizzazioni come stringhe per controllare (es. ['leggi', 'cambia']), e app è il nome dell'applicazione come stringa. Per fare lo stesso controllo come has_perm sopra che si dice qualcosa di simile:

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

Se è necessario utilizzare le autorizzazioni oggetto o righe (che significano la stessa cosa), poi Django non può davvero aiutare da solo . La cosa bella è che puoi utilizzare sia le autorizzazioni di modello che quelle di oggetto side-by-side. Se vuoi permessi sugli oggetti, devi avere write your own (se si usa 1.2+) o trovare un progetto che qualcun altro ha scritto, uno che mi piace è lo django-objectpermissions da giorni di riposo.

+21

Questa è una buona risposta per i permessi, ma a malapena tocca gruppi e come funzionano in Django? – Simon

+3

Non c'è molto da fare per i gruppi, si tratta principalmente di raggruppare gli utenti insieme per applicare le autorizzazioni, proprio come i gruppi di utenti Linux. Tu dai il permesso a un gruppo e si estende a tutti i membri di quel gruppo. La documentazione dice tutto in realtà: https://docs.djangoproject.com/en/dev/topics/auth/default/#groups. –

+0

Sembra che Django Advent sia andato, c'è una versione dell'articolo su come scrivere i permessi degli oggetti su Github: https://github.com/djangoadvent/djangoadvent-articles/blob/master/1.2/06_object-permissions.rst –

Problemi correlati