如何使用会话限制对后端的访问,并且只允许管理员在flask中访问后端?(Python)

如何使用会话限制对后端的访问,并且只允许管理员在flask中访问后端?(Python),python,flask,Python,Flask,我想知道如何限制使用会话访问我网站的某些页面。在Summy中,我希望管理员通过与普通用户相同的登录表单登录,但使用他输入的凭据,他将被重定向到后端页面,在那里他可以完全访问前端网页和后端网页。当用户登录时,他们只能查看前端网页。我试图避免这样一种情况:用户登录,然后将web浏览器搜索栏中的URL从127.0.0.7/homepage更改为127.0.0.7/backend,并且由于他已登录,因此允许访问 我正在使用下面的代码检查用户是否已登录。如果没有,则会重定向到登录页面。我正在使用flask

我想知道如何限制使用会话访问我网站的某些页面。在Summy中,我希望管理员通过与普通用户相同的登录表单登录,但使用他输入的凭据,他将被重定向到后端页面,在那里他可以完全访问前端网页和后端网页。当用户登录时,他们只能查看前端网页。我试图避免这样一种情况:用户登录,然后将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')

用户通过身份验证后,您必须已经在登录视图中设置了会话['userkey'],您只需添加有关用户管理员状态的附加信息即可使其正常工作。如果将会话中的所有if“userkey”检查从视图函数外部移动到decorator中,这样做也会容易得多,这样就可以轻松地重用它来保护所有视图函数。此模式显示在flask文档的标题“需要登录的装饰器”下

在登录函数中,您应该在检索用户密钥和哈希密码的同时,查询数据库中的用户管理状态。然后,如果用户是管理员,只需将session[admin]=设置为True;如果用户不是管理员,则根本不设置

下面的代码将适用于decorator

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.wrapps装饰器正好用于更新已包装函数的元数据,以便像function.\uu name\uuuu这样的属性按预期运行。会话检查中的“userkey”与原始代码中的“userkey”相同,但我们会另外检查是否提供了状态,如果是,它是否也存储在会话中。在您的情况下,status的唯一值是“admin”,但此模式可以轻松扩展,以允许其他组访问网站的不同部分

假设所有的用户检查都是在decorator中执行的,那么您的后端视图功能可以简化为

@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)
同一个decorator可以用来保护所有前端视图函数,只需省略admin参数

@app.route('/frontend', methods=['POST', 'GET'])
@login_required()
def frontend():
    # .....

我不能直接回答你关于如何通过你的课程来完成这一点的问题,但使用登录管理器(如)可以相当容易地实现。实际上,通常情况下,用户自己并不实现这一点,而是使用一个模块。我将对此进行调查,为什么我被禁止提问?您能否详细介绍@wraps decorator的功能以及会话中所需的位