2009-04-15 5 views
2

Kann eine Middleware prüfen, ob ein Wert in der URL ist, z. B. eine Image-ID ("/ image/152 /"), und wenn dies der Fall ist, den aktuellen Benutzer überprüfen hat die Erlaubnis, dieses Bild zu sehen und wenn nicht zu einer anderen URL umleiten?Django Middleware + URLs

Ich musste meine eigenen Berechtigungen für diese Seite erstellen, an der ich arbeite, und ich möchte nicht fast jede Ansicht, die ich für die ganze Website schreibe, mit demselben Code blockieren, also dachte ich, eine Middleware wäre gut Idee dafür, aber ich bin mir nicht sicher, wie ich es machen soll.

Antwort

8

Ja, das ist möglich. Die django middleware docs for process_request anzuzeigen, dass:

def process_request (self, Anfrage)

Anfrage ist ein Httprequest-Objekt. Diese Methode wird bei jeder Anfrage aufgerufen, bevor Django entscheidet, welche Ansicht ausgeführt werden soll.

process_request() sollte entweder None oder ein HttpResponse-Objekt zurückgeben. Wenn None zurückgegeben wird, wird Django mit der Verarbeitung dieser Anforderung fortfahren und jede andere Middleware und dann die entsprechende Ansicht ausführen. Wenn es ein HttpResponse-Objekt zurückgibt, wird Django keine weiteren ANS, View- oder Exception-Middleware oder die entsprechende Ansicht aufrufen; Es wird diese HttpResponse zurückgeben.

Das HttpRequest Objekt hat eine path Attribut, das Sie die URL geben, die angefordert wurde.

Wenn Sie jedoch bevorzugen, können Sie das Django-System für Authentifizierungs-Backends auch erweitern, um den Benutzer in der Anfrage mit Berechtigungen basierend auf beliebigen Kriterien wie etwa Ihrem handgerollten Berechtigungsschema zu füllen. Auf diese Weise können Sie die Standard-Authentifizierungs-Dekoratoren (@permission_required und @user_passes_test) nutzen, und andere Apps/die Admin-Site wird in der Lage sein, Ihre Berechtigungen ebenfalls zu beachten. Das Benutzerobjekt und die erstellten Berechtigungen müssen sich nicht in den Benutzer-/Berechtigungstabellen von Django befinden und können virtuell bei der Anmeldung erstellt werden. Ich hatte eine Menge Erfolg damit.

Siehe Writing an authentication backend, wenn dies anspricht.

0

Wenn Sie die Berechtigung (Berechtigungssystem) in Middleware implementieren, werden Sie sich mit zwei Optionen enden:

  1. überprüfen URL und erlauben
  2. überprüfen URL für den Zugriff auf und lehnen Zugang

Wenn Ihre Anforderung ist so einfach, es ist in Ordnung, da Sie Ansichten nicht berühren müssen.

Aber im Allgemeinen, Permission System ist viel komplexer als das, zum Beispiel:

  1. Benutzer können FOO Zugriff/show_all/
  2. Aber kann er nicht foo Beispiel sehen oder Zugriff, das heißt, FOO/show/foo_1/
  3. Da er nicht foo_1 Instanz zugreifen können, sollten wir sie nicht (alle foo Instanzen)

Wenn Sie zusammen über 3 implementieren möchten in show_all zeigen, schlage ich vor writin g Ihr eigenes Autorisierungs-Backend, mit dem DJango gerne arbeitet.Alles, was Sie tun müssen, ist wenige Methoden (Ihre spezifische Logik) zu implementieren und als Backend anzuhängen.

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