Domanda

Può un assegno middleware per vedere se un valore è nella URL, come ad esempio un ID immagine ( "/ immagine / 152 /"), e se è quindi fare alcune verifiche per assicurarsi che l'utente corrente dispone delle autorizzazioni per visualizzare quell'immagine e se non reindirizzare a un altro URL?

Ho dovuto rotolare il mio permesso per questo sito sto lavorando su e io non voglio intasare quasi ogni vista che scrivo per l'intero sito con lo stesso codice, così ho pensato un middleware sarebbe una buona idea per questo, ma non sono sicuro di come fare per farlo.

È stato utile?

Soluzione

Sì, questo è possibile. Il Django docs middleware per process_request indicano che

  

def process_request (auto, richiesta)

     

richiesta è un oggetto HttpRequest. Questo metodo viene chiamato su ogni richiesta, prima di Django decide quale visualizzare da eseguire.

     

process_request () deve restituire Nessuno o un oggetto HttpResponse. Se restituisce None, Django continuerà l'elaborazione di questa richiesta, l'esecuzione di qualsiasi altro middleware e, quindi, la visualizzazione appropriata. Se si restituisce un oggetto HttpResponse, Django non preoccuparsi di chiamare qualsiasi altra richiesta, visualizzare o eccezioni middleware, o la vista appropriata; si tornerà che HttpResponse.

L'oggetto HttpRequest ha un attributo path che vi darà l'URL che è stato richiesto.

Se si preferisce, tuttavia, si noti che è anche possibile estendere il sistema di Django per backend di autenticazione per popolare l'utente nella richiesta con le autorizzazioni sulla base di eventuali criteri arbitrari, come forse il vostro schema di permessi arrotolato a mano. In questo modo, è possibile sfruttare i decoratori di autenticazione di default (@permission_required e @user_passes_test), e altre applicazioni / l'amministratore del sito sarà in grado di onorare le autorizzazioni pure. L'oggetto d'uso e le autorizzazioni creato non hanno bisogno di risiedere in tabelle utente / permessi di Django, e possono essere creati virtualmente su login; Ho avuto una buona dose di successo con questo.

Scrivere un backend di autenticazione se questo appello.

Altri suggerimenti

Se si implementa l'autorizzazione (sistema di autorizzazione) nel middleware, vi ritroverete con due opzioni:

  1. Controlla URL e permette di accesso
  2. Verifica URL e rifiutare l'accesso

Se la vostra esigenza è che molto semplice, va bene, dal momento che non c'è bisogno di toccare punti di vista.

Ma in generale, il sistema di autorizzazione è molto più complesso di quello che, ad esempio:

  1. L'utente può accedere FOO / show_all /
  2. Ma, non può vedere o accedere esempio foo, cioè, FOO / mostra / foo_1 /
  3. Dal momento che, egli non può accedere esempio foo_1, non dobbiamo mostrare loro in show_all (Tutte le istanze di Foo)

Se si desidera implementare sopra 3 insieme, vi suggerisco di scrivere il proprio back-end di autorizzazione, che Django felice di lavorare con. Tutto quello che dovete fare è implementare alcuni metodi (la logica specifica) e fissare come backend.

Leggi: http: // docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends

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