Domanda

Sto esplorando i dettagli di Django da circa una settimana e mi piace quello che vedo. Tuttavia ho riscontrato un po 'di negatività in relazione al controllo approfondito delle autorizzazioni per l'interfaccia CRUD.

Quello che sto scrivendo è un'app Web di gestione client Intranet. L'organizzazione è di circa 6 livelli e devo limitare l'accesso ai gruppi di client in base ai livelli. In continua espansione. Ho una buona idea di come lo farò, ma non sono sicuro che sarò in grado di integrarlo bene nell'interfaccia di amministrazione pre-costruita.

Ho fatto uno sviluppo di Django assolutamente nullo altrimenti probabilmente avrei un'idea migliore sul fatto che funzionerebbe o meno. Probabilmente non userò Django se l'interfaccia di amministrazione generata sarà inutile per questo progetto, ma come ho detto, c'è una forte dipendenza da permessi personalizzati a grana fine.

Django mi permetterà di creare autorizzazioni / regole personalizzate e integrarlo perfettamente nell'interfaccia CRUD dell'amministratore?

Aggiornamento 1: voglio usare l'app di amministrazione per ridurre al minimo la ripetizione della generazione di interfacce CRUD, quindi sì lo considero un must.

Aggiornamento due:

Voglio descrivere le autorizzazioni necessarie per questo progetto.

Un client può appartenere a uno o più "negozi". I dipendenti a tempo pieno dovrebbero essere in grado di modificare i clienti nel loro negozio (anche se appartengono a un altro negozio). Tuttavia, non dovrebbero essere in grado di vedere / modificare i client in un altro negozio. I casual dovrebbero essere in grado di visualizzare i clienti solo in base al negozio in cui sono stati scelti (o se il casual è loggato come utente del negozio - più probabilmente).

La gestione sopra di loro deve essere in grado di vedere tutti i dipendenti per i negozi che gestiscono, niente di più.

Il senior management dovrebbe essere in grado di modificare TUTTI i dipendenti e concedere le autorizzazioni sottostanti.

Dopo aver letto la documentazione di django, dice che non è possibile (automaticamente) impostare le autorizzazioni per un sottoinsieme di un gruppo. Solo l'intero gruppo. È abbastanza facile deridere le tue autorizzazioni per questo scopo?

È stato utile?

Soluzione

Se leggo correttamente i tuoi requisiti aggiornati, non credo che il sistema di autenticazione esistente di Django sarà sufficiente. Sembra che tu abbia bisogno di un sistema ACL completo.

Questo argomento è stato sollevato diverse volte. Prova a cercare su django + acl.

Campionamenti casuali ...

C'era un progetto Summer of Code un paio di anni fa, ma non sono sicuro di dove siano arrivati. Vedi http://code.djangoproject.com/wiki/GenericAuthorization

C'è un nuovo biglietto su djngoproject.org che potrebbe essere interessante:

Esistono alcuni interessanti frammenti di codice su dumpz.org:

... ma ci sono zero documenti.

Buona fortuna!

Altri suggerimenti

Il sistema di autorizzazioni di Django governa totalmente. Ogni modello ha un set predefinito di autorizzazioni. Puoi anche aggiungere nuove autorizzazioni ai tuoi modelli.

Ogni utente dispone di un set di autorizzazioni e di appartenenze a gruppi. I singoli utenti possono avere autorizzazioni individuali. Ed ereditano le autorizzazioni dall'appartenenza al gruppo.

Le funzioni (e i modelli) di visualizzazione possono facilmente verificare la presenza di tali autorizzazioni a qualsiasi livello di granularità che è necessario utilizzare.

E se questo non è abbastanza per te, il componente aggiuntivo Profilo ti offre ancora più opzioni per la definizione di un " Utente " e le loro capacità, autorizzazioni, ruoli, responsabilità, ecc.

E se questo non è abbastanza per te, puoi definire i tuoi schemi di autenticazione.


L'importante è non cercare di definire gruppi che sono effettivi sottoinsiemi di utenti, non casualmente titoli o ruoli definiti. Non è mai necessario " impostare le autorizzazioni per un sottoinsieme di un gruppo " ;. Devi avere gruppi più piccoli. Gruppi definiti attorno a sottoinsiemi di persone.

Le autorizzazioni predefinite di Django riguardano l'accesso al modello, non l'accesso alla riga all'interno di un modello. D'altra parte, il tuo problema riguarda i sottoinsiemi di righe in diversi modelli: Client, Store, Employee, Manager.

Tra questi elementi avrai bisogno di un set base di FK e di alcuni filtri per sottoinsieme delle righe. Potresti avere problemi a farlo con le pagine di amministrazione predefinite. Potresti aver bisogno della tua versione di admin per utilizzare filtri specializzati.


Se non riesci a farlo con il sistema di autorizzazioni Django, dovresti ripensare i tuoi casi d'uso. Scherzi a parte.

[L'interfaccia Django-REST, tuttavia, è completamente un'altra bestia e richiede un po 'di cura e alimentazione.]

ModelAdmin gli oggetti hanno Metodi has_add_permission , has_change_permission , has_delete_permission e queryset che possono essere utilizzati per imporre autorizzazioni su ciò che l'utente ha effettuato l'accesso può vedere e modificare: è possibile creare una sottoclasse che le utilizza per applicare tutte le autorizzazioni che si desidera implementare e registrare tutti i modelli con l'applicazione admin utilizzando la sottoclasse.

Tuttavia, tutto dipende da come funzionerà esattamente il tuo sistema di autorizzazioni - quali sono i requisiti esatti che cadono dalle tue autorizzazioni dettagliate? Più ti allontani da ciò che l'applicazione admin è stata progettata per fare, più lavoro ci vorrà, ma ci sono molti hook che puoi usare per implementare i tuoi requisiti personalizzati. Ecco un post sul blog di Luke Plant che fornisce esempi di alcuni messa a punto che puoi fare senza dover scavare troppo in profondità.

Deve assolutamente basarsi sull'applicazione admin ? Visualizzazioni generiche e ModelForms può occuparsi di molti dei noiosi bit coinvolti in implementando CRUD, quindi diffidare di essere troppo impegnato nella personalizzazione di admin - è quasi una tradizione di Django iniziare appendendosi sull'app admin e cosa può e cosa non può fare, inizialmente pensando che non dovrai mai più scrivere codice ;)

Da django 1.2 esiste il supporto per le autorizzazioni a livello di riga, che django-guardian rende molto intuitivo da gestire.

Potresti anche dare un'occhiata al monkeypatch con autorizzazioni granulari: http://code.google.com/p/django-granular-permissions/

Aggiunge autorizzazioni a livello di riga al sistema di autorizzazioni di django.

Ho appena trovato http://bitbucket.org/jezdez/django-authority/ , sembra promettente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top