2012-01-21 10 views
6

Come ci si assicura che un utente possa modificare solo gli oggetti che ha creato? Qual è il modo migliore per configurarlo?permessi a livello di oggetto django

Utilizzo il framework django-rest e mi chiedo se c'è un modo in cui posso impedire agli utenti di visualizzare/modificare gli oggetti che non "appartengono".

class Video(models.Model): 
    owner = models.ForeignKey(User) 
    ... 

Quindi l'utente 'x' dovrebbe essere in grado di modificare i video nel proprio owner_set.

+0

Come si definisce l'utente "proprietà" di un oggetto? Per favore includi abbastanza modelli che possiamo vedere di cosa stai parlando. –

+0

@ S.Lott appena aggiornato per includerlo. –

risposta

2

Presumibilmente si dispone di sessioni e il modello di autenticazione attivato.

Devi essere sicuro che le viste tutte (REST e non REST) ​​richiedono l'autenticazione.

Per non-REST, è facile. Devi semplicemente usare un decoratore di base @login-required ovunque.

Per il framework Django-REST, leggere questo: http://django-rest-framework.org/library/authentication.html#module-authentication.

È necessario utilizzare il mix di autenticazione per assicurarsi che l'autenticazione sia effettivamente avvenuta.

Il framework supporta l'autenticazione BASIC, che richiede una connessione SSL sicura. Non è troppo difficile implementare l'autenticazione DIGEST, che non richiede SSL.

Evitare sessioni. Violare un principio di REST per accedere e disconnettersi. Il framework supporta le sessioni, ma non è l'ideale.

Una volta che tutte le richieste sono state autenticate, conoscerai l'utente.

Se si conosce l'utente, quindi user.video_set funziona perfettamente. Puoi anche utilizzare Video.objects.filter(...) per assicurarti che stai interrogando l'utente, ma è più facile confermare che il codice sia corretto se lavori con user.video_set.get(...) o user.video_set.filter() o altro.

Tutto il controllo dell'autorizzazione pertinente viene eseguito in Views. Stai fornendo Views per le tue ModelResources.

Queste sono "viste basate su classi". La documentazione è qui: https://docs.djangoproject.com/en/dev/topics/class-based-views/#viewing-subsets-of-objects

Il trucco è scegliere tutti i giusti missaggi e serializzatori.

Ad esempio, è possibile ottenere la miscelazione di elaborazione in questo modo:

http://django-rest-framework.org/howto/mixin.html

Potrai realizzare il filtro nel metodo get

+1

Grazie mille per la risposta completa! Mi sto ancora chiedendo dove sia il posto appropriato per inserire il codice che filtri in base all'utente? Ho appena iniziato a usare Django-REST e sto avendo problemi a capirlo ... –