Я использовал флеш-фрагмент для моего флеш-входа, который проверяет, что пользователь вошел в систему:
from functools import wraps
def logged_in(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if session.get('logged_in') is not None:
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
И я украшаю такие взгляды:
@app.route('/secrets', methods=['GET', 'POST'])
@logged_in
def secrets():
error = None
Я хотел бы сделать что-то подобное для авторизации. Сейчас у меня много просмотров, чтобы проверить, что пользователь владеет ресурсом, скажем, ресурсом hotdogs
.
Если пользователь logged_in является владельцем этого конкретного хот-дога, он может редактировать и управлять своими хот-догами. Если нет, я выталкиваю его на несанкционированный экран.
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
def addmustard(hotdog):
if not (authorizeowner(hotdog)):
return redirect(url_for('unauthorized'))
do_stuff()
authorizeowner()
принимает хот-дог как ввод и проверяет, что зарегистрированный владелец хот-дога совпадает с именем владельца, указанным в переменной сеанса.
Я попытался создать функцию-оберщик/декоратор owns_hotdog, аналогичный моей регистрации в одном, но он жаловался, что не принимает аргументы. Как я могу достичь чего-то подобного? Что-то вроде...
def owns_hotdog(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not authorizeowner(hotdog):
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
Из сообщения об ошибке, декоратор, похоже, не получает аргумент hotdog, доступ к которому имеет вид Flask из переменной в маршруте. Я надеюсь на что-то вроде...
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
@owns_hotdog(hotdog)
def addmustard(hotdog):
do_stuff()
Все работает с моей текущей функцией authorizeowner (hotdog), но просто кажется, что это чище иметь это место как обертка поверх моего маршрута, а не как первая строка внутри маршрута.
Некоторые другие примечания:
- Я знаю, что Flask-Security и Flask-Principal могут управлять разрешение для меня. К сожалению, я использую неподдерживаемый базы данных и я не могу использовать эти расширения. Так что я вынуждены выполнять аутентификацию без них.
- Если вы видите какие-либо яркие дыры при авторизации таким образом, пожалуйста, дайте мне знать!