Как использовать сеансы, чтобы ограничить доступ к бэкэнду и разрешить только администратору доступ к нему в колбе?(Python) - PullRequest
0 голосов
/ 24 октября 2018

Я хотел бы знать, как ограничить доступ к определенным страницам моего сайта с помощью сеансов.Итак, я хотел бы, чтобы администратор входил через ту же форму входа, что и обычные пользователи, но с использованием введенных им учетных данных он будет перенаправлен на серверную страницу, где у него будет полный доступ к обоим интерфейсным веб-страницам.и внутренние веб-страницы.Когда пользователь входит в систему, он может просматривать только интерфейсные веб-страницы.Я пытаюсь избежать ситуации, когда пользователь входит в систему, а затем меняет URL-адрес в строке поиска веб-браузера с 127.0.0.7/homepage на 127.0.0.7/backend, и ему разрешен доступ, поскольку он вошел в систему.

Я использую приведенный ниже код, чтобы проверить, вошел ли пользователь в систему. Если это не так, он перенаправляется на страницу входа.Я использую фляжку.Любые предложения приветствуются.

Спасибо.

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')

1 Ответ

0 голосов
/ 25 октября 2018

Вы уже должны устанавливать сессию ['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():
    # .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...