簡體   English   中英

如何使用會話限制對后端的訪問,僅允許管理員在flask中訪問后端? (蟒蛇)

[英]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 sessionif '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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM