ユーザーがログインしていることを確認するフラスコログインにフラスコスニペットを使用しました。
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
。
login_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
エラー メッセージから、デコレーターは、Flask ビューがルート内の変数からアクセスできる hotdog 引数を受け取っていないようです。私の希望は次のようなものです...
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
@owns_hotdog(hotdog)
def addmustard(hotdog):
do_stuff()
すべてが現在の authorizeowner(hotdog) 関数で機能しますが、これをルート内の最初の行としてではなく、ルートの上にラッパーとして配置する方がきれいに見えます。
その他の注意事項:
- Flask-Security と Flask-Principal が私の代わりに承認を管理できることを知っています。残念ながら、サポートされていないデータベース バックエンドを使用しているため、これらの拡張機能を使用できません。そのため、それらなしで認証を行う必要があります。
- この方法で承認を行う際に明らかな穴がある場合は、お知らせください。