Ich habe eine kleine Django-Anwendung mit einer Ansicht, die ich auf bestimmte Benutzer beschränken möchte. Jeder aus einem bestimmten Netzwerk sollte diese Ansicht ohne weitere Authentifizierung nur anhand der IP-Adresse sehen können. Jeder andere Benutzer außerhalb dieses IP-Bereichs sollte nach einem Kennwort gefragt und mit der standardmäßigen Django-Benutzerverwaltung authentifiziert werden.
Ich nehme an, dass ich ein benutzerdefiniertes Authentifizierungs-Backend dafür schreiben muss, aber die Dokumentation verwirrt mich, da die authenticate()
-Funktion eine Kombination aus Benutzername / Passwort oder Token zu erwarten scheint. Mir ist nicht klar, wie ich mich hier mit IP-Adressen authentifizieren soll.
Was wäre der richtige Weg, um die IP-Adress-basierte Authentifizierung in Django zu implementieren? Ich würde es vorziehen, so viel vorhandene Bibliotheksfunktionen wie möglich für sicherheitsrelevanten Code zu verwenden, anstatt alles selbst zu schreiben.
Für diese Art der Authentifizierung gibt es zwei geeignete Ansätze:
Sie können auch einen kleinen Dekorateur für diesen Zweck schreiben:
%Vor%allowedIps ist in meinem Fall eine Datei (allowedIps.py), die die Regexe für erlaubte IPs in einem Tupel wie diesem speichert:
%Vor%Hoffe, das kann helfen oder eine Idee geben. Hinweis: Wenn Sie authenticated_by_ip an die dekorierte Ansicht zurückgeben, muss Ihre Ansicht diesen Parameter akzeptieren. Sie können ihn auch einfach weglassen, wenn Sie ihn nicht benötigen. Sie können die Regexe auch genauer definieren, um nur bis zu drei Ziffern zu akzeptieren.
Sie können diesen Dekorateur versuchen. Ich habe es getestet funktioniert gut:
%Vor%Sie müssen kein Authentifizierungs-Backend für den von Ihnen geschriebenen Anwendungsfall schreiben. Das Schreiben eines IP-basierten Dispatchers in der Middleware-Ebene wird wahrscheinlich ausreichen
Wenn die URLs Ihrer App übereinstimmen, sollte process_request nach einem authentifizierten django-Benutzer suchen und diesen Benutzer einer Whitelist zuordnen.
IMO, das Lösen mit Django ist in Ordnung, wenn es eine kleine nicht leistungskritische Seite ist.
Es ist besser, die nicht autorisierten Benutzer mit Ihrem Apache- oder Nginx-Dienst in Schach zu halten. Zum Beispiel habe ich in Nginx diese Zeilen in meiner Site-Konfiguration:
%Vor%allowed_ips.conf ist in / etc / nginx und sieht (etwas) so aus:
%Vor%Ich glaube, das ist besser, weil die relativ langsamen Django-Prozesse niemals von den blockierten IPs berührt werden. Dies ist von Bedeutung, wenn Sie aus Leistungs- oder Sicherheitsgründen Bots oder andere Länderadressbereiche blockieren.
Tags und Links python django authentication