Authentifizierung durch IP-Adresse in Django

9

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.

    
Mad Scientist 12.09.2012, 07:53
quelle

6 Antworten

9

Für diese Art der Authentifizierung gibt es zwei geeignete Ansätze:

  • Als Dekorator: Wenn einige der Ansichten (aber nicht viele davon) diese Prüfung erfordern, dann ist es besser, einen Dekorator dafür zu schreiben (so wie @Jingo geschrieben hat)
  • Als Middleware: Wenn diese Überprüfung von allen (oder vielen) Ansichten durchgeführt werden muss, anstatt einen Dekorator zu verwenden, schreiben Sie ein benutzerdefinierten Middleware-Klassen

        
FallenAngel 12.09.2012 13:07
quelle
7

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.

    
Jingo 12.09.2012 08:56
quelle
4

Sie können diesen Dekorateur versuchen. Ich habe es getestet funktioniert gut:

%Vor%     
Ranvijay Sachan 10.08.2015 14:59
quelle
3

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.

    
Hedde van der Heide 12.09.2012 07:58
quelle
1
%Vor%

Sie benötigen allow_ip in Ihrem UserProfile-Modell, das bei der Registrierung oder Änderungen auf der Benutzerseite

gespeichert wird     
freylis 12.09.2012 11:40
quelle
1

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.

    
Paul Whipp 30.12.2013 00:08
quelle

Tags und Links