我想限制文件對登錄用戶可用,但返回403錯誤或類似情況。例如,用戶只有在登錄後才能查看/下載/static/data/example.csv
。限制對登錄用戶的靜態文件訪問
我知道如何使用Flask-Login控制文件的實際顯示(如果他們沒有登錄),但不知道如何控制如果他們直接在瀏覽器中訪問該鏈接,則阻止訪問該文件。
我想限制文件對登錄用戶可用,但返回403錯誤或類似情況。例如,用戶只有在登錄後才能查看/下載/static/data/example.csv
。限制對登錄用戶的靜態文件訪問
我知道如何使用Flask-Login控制文件的實際顯示(如果他們沒有登錄),但不知道如何控制如果他們直接在瀏覽器中訪問該鏈接,則阻止訪問該文件。
Flask adds a static route提供靜態文件。當你在製作時,你通常會「短路」這條路線,這樣Nginx就會在請求到達你的應用程序之前提供這些文件。不要添加這個「短路」,而是讓它離開,讓Flask處理請求。用一個由Flask-Login的login_required
包裝的靜態路由覆蓋靜態路由。
from flask_login import login_required
app.view_functions['static'] = login_required(app.send_static_file)
這通常是矯枉過正不過,既然你想真正靜態文件被不管是什麼使頁面看起來有權在用戶不登錄(否則CSS甚至不會爲送服務登錄頁面)。相反,將Nginx提供的靜態文件夾「短路」,並定義一條路徑來爲其他目錄(如實例文件夾)提供受保護文件。見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
)
這將在instance folder「保護」的目錄服務文件,登錄用戶只能。還可以添加其他限制,例如只允許某些用戶訪問某些文件。類似於靜態路徑,就可以生成一個URL到文件裏:
url_for('protected', filename='data/example.csv')
不知道這是做的最好的方式,但我一般用於通過瓶的文件,使這些文件無法訪問通過nginx的(即不要把它們放在靜態文件夾中)。通過這種方式,您可以使用Flask-Login控制訪問。這個鏈接可能會有所幫助:http://flask.pocoo.org/docs/0.10/patterns/streaming/ – Gohn67
感謝Gohn67,我沒有想過把它們移出靜態文件夾,直到你提到這個。 – iamlolz
根據您的隱私問題,您可以讓nginx檢查是否存在與身份驗證相關的cookie,並且僅在找到時才提供靜態文件。 – dirn