[英]How to use sessions to restrict access to the backend and only allow the admin to access it in flask? (Python)
我想知道如何使用會話限制對網站某些頁面的訪問。 在夏季,我希望管理員通過與普通用戶相同的登錄表單登錄,但是使用他輸入的憑據,他將被重定向到后端頁面,在該頁面他可以完全訪問兩個前端網頁和后端網頁。 用戶登錄時,只能查看前端網頁。 我正在嘗試避免用戶登錄然后將Web瀏覽器搜索欄中的URL從127.0.0.7/homepage更改為127.0.0.7/backend並被允許訪問的情況,因為他已經登錄。
我正在使用以下代碼檢查用戶是否已登錄。如果未登錄,則將他們重定向到登錄頁面。 我正在使用flask框架。 任何建議,不勝感激。
謝謝。
app.route('/backend', methods=['POST', 'GET'])
def backend():
if 'userkey' in session:
# connect to database using pymysql
if cursor.rowcount == 0:
return render_template('backend.html', msg="No orders found...")
else:
rows = cursor.fetchall()
return render_template('backend.html', orderdata=rows)
elif 'userkey' not in session:
return redirect('/login')
else:
return redirect('/login')
一旦用戶通過身份驗證,您必須已經在登錄視圖中設置了session ['userkey'],您只需要添加有關用戶管理員狀態的其他信息即可使此功能生效。 如果將會話檢查中的所有if 'userkey' in session
都if 'userkey' in session
了視圖函數之外,也將變得更加容易,以便可以輕松地重用它來保護所有視圖函數。 在燒瓶文檔的“需要登錄的裝飾器”標題下http://flask.pocoo.org/docs/1.0/patterns/viewdecorators/中顯示了這種模式。
在登錄功能中,您應該在檢索用戶密鑰和哈希密碼的同時,在數據庫中查詢用戶的管理員狀態。 然后,如果用戶是管理員,則只需將session [“ admin”] = True設置為真;如果用戶不是管理員,則根本不設置此設置。
以下代碼將對裝飾器起作用。
from functools import wraps
from flask import session
def login_required(status=None):
def login_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
if 'userkey' in session and (status is None or status in session):
return func(*args, **kwargs)
else:
return redirect("/login")
return wrapper
return login_decorator
然后應應用此裝飾器來保護您的所有視圖功能。 然后,它將在每個視圖功能之前執行,如果所有條件都滿足,則允許視圖繼續進行;如果不滿足,則將用戶重定向回登錄頁面。 它具有可選的單個參數狀態,在您的情況下,對於所有后端視圖,該狀態均應為“ admin”,而對於不需要管理員特權的前端視圖,則不應提供該狀態。 函數內部的functools.wraps裝飾器用於更新包裝函數的元數據,以便像function.__name__
這樣的屬性按預期運行。 會話檢查中的“用戶密鑰”與您原始代碼中的“用戶密鑰”相同,但我們還會檢查是否提供了狀態,如果提供了狀態,則是否也將其存儲在會話中。 在您的情況下,狀態的唯一值是“ admin”,但是可以輕松擴展此模式,以允許其他每個組都可以訪問網站的不同部分。
假定所有用戶檢查都在裝飾器中進行,則可以將后端視圖功能簡化為
@app.route('/backend', methods=['POST', 'GET'])
@login_required("admin")
def backend():
# connect to database using pymysql
if cursor.rowcount == 0:
return render_template('backend.html', msg="No orders found...")
else:
rows = cursor.fetchall()
return render_template('backend.html', orderdata=rows)
可以使用相同的裝飾器來保護所有前端視圖功能,只需省略“ admin”參數即可。
@app.route('/frontend', methods=['POST', 'GET'])
@login_required()
def frontend():
# .....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.