2014-12-22 10 views
7

Desidero limitare i file agli utenti che hanno effettuato l'accesso, ma in caso contrario restituire un errore 403 o simile. Ad esempio, un utente dovrebbe essere in grado di visualizzare/scaricare /static/data/example.csv solo se ha effettuato l'accesso.Limita l'accesso ai file statici agli utenti registrati

So come controllare la visualizzazione effettiva dei file utilizzando Flask-Login se non sono connessi, ma non come per bloccare l'accesso al file se visita il link direttamente nel proprio browser.

+2

Non sono sicuro se questo è il modo migliore per farlo, ma io di solito servono i file attraverso Flask e rendere i file accessibili tramite nginx (cioè, non metterli in una cartella statica). In questo modo controlli l'accesso con Flask-Login. Questo collegamento potrebbe essere utile: http://flask.pocoo.org/docs/0.10/patterns/streaming/ – Gohn67

+0

Grazie a Gohn67, non avevo pensato di spostarli dalla cartella statica finché non lo hai menzionato. – iamlolz

+1

A seconda dei problemi di privacy, è possibile fare in modo che nginx verifichi la presenza di un cookie correlato all'autenticazione e serva solo i file statici quando vengono trovati. – dirn

risposta

13

Flask adds a static route per servire file statici. Quando sei in produzione, di solito "fai un corto circuito" su questa rotta in modo che Nginx serva i file prima che la richiesta arrivi alla tua app. Invece di aggiungere questo "cortocircuito", lasciarlo fuori e lasciare che Flask gestisca le richieste. Sovrascrivi la route statica con una che è stata spostata da Flask-Login's login_required.

from flask_login import login_required 

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

questo è in genere eccessivo, però, dal momento che si desidera file statici veramente da servire non importa quale modo che le pagine guardano diritto alla non-login degli utenti (altrimenti il ​​CSS non sarebbe nemmeno essere inviato per la pagina di login). Invece, "cortocircuito" la cartella statica che deve essere servita da Nginx e definire una route che servirà i file protetti da qualche altra directory, come la cartella di istanza. Vedi 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 
    ) 

Questo servirà i file dalla cartella "protetta" nel instance folder effettuale il login solo gli utenti. Altre restrizioni potrebbero essere aggiunte, ad esempio consentendo solo a determinati utenti di accedere a determinati file. Simile al percorso statico, è possibile generare un URL in un file con:

url_for('protected', filename='data/example.csv') 
Problemi correlati