2014-12-22 11 views
7

Ich möchte Dateien beschränken, um angemeldete Benutzer verfügbar zu sein, aber sonst einen Fehler 403 oder ähnliches zurückgeben. Zum Beispiel sollte ein Benutzer /static/data/example.csv nur anzeigen/herunterladen können, wenn er eingeloggt ist.Beschränken Sie den statischen Dateizugriff auf angemeldete Benutzer

Ich weiß, wie man die tatsächliche Anzeige der Dateien mit Flask-Login steuert, wenn sie nicht eingeloggt sind, aber nicht wie um den Zugriff auf die Datei zu blockieren, wenn sie den Link direkt in ihrem Browser aufrufen.

+2

Nicht sicher, ob dies der beste Weg, es zu tun ist, aber ich dienen in der Regel die Dateien über Flask und diese Dateien nicht zugänglich über nginx machen (dh, legen Sie sie nicht in statischen Ordner). Auf diese Weise steuern Sie den Zugriff mit Flask-Login. Dieser Link kann hilfreich sein: http://flask.pocoo.org/docs/0.10/patterns/streaming/ – Gohn67

+0

Danke Gohn67, ich hatte nicht daran gedacht, sie aus dem statischen Ordner zu entfernen, bis du das erwähnt hast. – iamlolz

+1

Abhängig von Ihren Datenschutzbedenken können Sie nginx auf das Vorhandensein eines Authentifizierungs-Cookies überprüfen lassen und nur die statischen Dateien bereitstellen, wenn sie gefunden werden. – dirn

Antwort

13

Flask adds a static route für statische Dateien. Wenn Sie in Produktion sind, "schließen" Sie diese Route in der Regel kurz, sodass Nginx die Dateien bereitstellt, bevor die Anfrage überhaupt zu Ihrer App gelangt. Anstatt diesen "Kurzschluss" hinzuzufügen, lassen Sie es aus und lassen Flask die Anfragen bearbeiten. Überschreiben Sie die statische Route mit einer, die von Flask-Login login_required umschlossen ist.

from flask_login import login_required 

app.view_functions['static'] = login_required(app.send_static_file) 

Dies ist in der Regel jedoch viel des Guten, da Sie wollen wirklich statische Dateien, egal um bedient werden, was so dass die Seiten aussehen Recht auf Benutzer-nicht angemeldet (sonst wird die CSS würde nicht einmal für die gesendet werden Loginseite). Stattdessen "schließen" Sie den statischen Ordner, der von Nginx bedient werden soll, und definieren Sie eine Route, die geschützte Dateien aus einem anderen Verzeichnis wie dem Instanzordner bereitstellt. Siehe flask.send_from_directory.

import os 
from flask import send_from_directory 
from flask_login import login_required 

@app.route('/protected/<path:filename>') 
@login_required 
def protected(filename): 
    return send_from_directory(
     os.path.join(app.instance_path, 'protected'), 
     filename 
    ) 

Diese Dateien aus dem Verzeichnis dienen wird „geschützt“ im instance folder eingeloggte Benutzer nur. Es können auch andere Einschränkungen hinzugefügt werden, z. B. nur bestimmten Benutzern Zugriff auf bestimmte Dateien zu gewähren. Ähnlich wie bei der statischen Pfad, können Sie eine URL zu einer Datei mit generieren:

url_for('protected', filename='data/example.csv') 
Verwandte Themen