Вы уже должны устанавливать сессию ['userkey'] в своем представлении входа в систему после того, как пользователь прошел аутентификацию, вам просто нужно добавить дополнительную информацию о статусе администратора пользователя, чтобы это работало.Также было бы намного проще, если бы вы переместили все проверки 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():
# .....