Как этот вопрос: Лучший способ сделать Django login_required по умолчанию
Я использую Flask-Login
login_required декоратор сейчас. Есть ли способ сделать поведение по умолчанию во Flask
?
Как этот вопрос: Лучший способ сделать Django login_required по умолчанию
Я использую Flask-Login
login_required декоратор сейчас. Есть ли способ сделать поведение по умолчанию во Flask
?
Я сделал это в своем проекте 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
Если вы используете чертежи и должны защищать весь проект с помощью логина, вы можете сделать весь before_request
запрос на вход.
Это то, что я использую для моего проекта CMS:
@cms.before_request
@login_required
def before_request():
if g.user.role != ROLE_ADMIN:
abort(401)
Если вам нужно только проверить, зарегистрирован ли пользователь (а не если у пользователя есть привилегии), вы можете просто pass
выполнить функцию
Это является продолжение (немного больше вещим, но тот спорно) к @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