Подтвердить что ты не робот

Лучший способ сделать Flask-Login login_required по умолчанию

Как этот вопрос: Лучший способ сделать Django login_required по умолчанию

Я использую Flask-Login login_required декоратор сейчас. Есть ли способ сделать поведение по умолчанию во Flask?

4b9b3361

Ответ 1

Я сделал это в своем проекте instruments. Я использую декоратор before_request:

@app.before_request
def check_valid_login():
    login_valid = 'user' in session # or whatever you use to check valid login

    if (request.endpoint and 
        'static' not in request.endpoint and 
        not login_valid and 
        not getattr(app.view_functions[request.endpoint], 'is_public', False) ) :
        return render_template('login.html', next=request.endpoint)

а затем я создал декоратор is_public() для нескольких мест, которые должны быть доступны без входа:

def public_endpoint(function):
    function.is_public = True
    return function

Ответ 2

Если вы используете чертежи и должны защищать весь проект с помощью логина, вы можете сделать весь before_request запрос на вход.

Это то, что я использую для моего проекта CMS:

@cms.before_request
@login_required
def before_request():
    if g.user.role != ROLE_ADMIN:
        abort(401)

Если вам нужно только проверить, зарегистрирован ли пользователь (а не если у пользователя есть привилегии), вы можете просто pass выполнить функцию

Ответ 3

Это является продолжение (немного больше вещим, но тот спорно) к @MalphasWats уже большой ответ.

Также содержит важное исправление безопасности, предложенное @nonagon.

Объяснение уязвимости с помощью 'static' in request.endpoint:

Представьте, что есть маршрут, который может быть определен пользователем каким-либо образом, например, ссылка на профиль.

Если пользователь задает свое имя, скажем, Static Joe, то:

"Static Joe" --slugifys-->/usr/profiles/static_joe.

Таким образом, обнародование этого маршрута. Это просто напрашивается на неприятности.


Вот функция защиты маршрута, которая добавляется перед каждой обработкой запроса:

@app.before_request
def check_route_access():
    if any([request.endpoint.startswith('static/'),
            current_user.is_authenticated(),  # From Flask-Login
            getattr(app.view_functions[request.endpoint],'is_public',False)]):
        return  # Access granted
    else:
        return redirect(url_for('users.login_page'))

(Flask-Login является отличным модулем и упрощает обработку сеансов)

А вот декоратор (@public_route), который вы можете использовать, чтобы разрешить доступ к специальным страницам, которым по умолчанию нужен публичный доступ. (страница регистрации, страница входа):

def public_route(decorated_function):
    decorated_function.is_public = True
    return decorated_function