Jinja2 と Flask を使用してテンプレート レベルで詳細な ACL を実装するにはどうすればよいですか?
これは、Jinja2 コンテキスト ディクショナリまたは事前構築済みの Flask ACL ライブラリを使用していないものです。これは私自身の疑似 ACL であり、単純にデータベースにロールを照会し、それをインデックス関数に取得します。
( The Flask Mega-Tutorialから変更されたソース)
def index():
user = {'nickname': 'Miguel'} # fake user
acl = {'role' : 'Supervisor'} #<---- hardcoded in lieu of a database call from somewhere
posts = [ # fake array of posts
{
'author': {'nickname': 'John'},
'body': 'Beautiful day in Portland!'
},
{
'author': {'nickname': 'Susan'},
'body': 'The Avengers movie was so cool!'
}
]
return render_template("index.html",
title='Home',
user=user,
posts=posts
acl=acl) #<----made up acl data
<html>
<head>
{% if "Supervisor" in acl.role %} #<---- using made up ACL data from index
<title>{{ title }} - Welcome Manager</title>
{% else %}
<title>Welcome Employee</title>
{% endif %}
</head>
<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>
</html>
このようなFlaskとACLのライブラリをいくつか見てきました
https://github.com/mikeboers/Flask-ACL
しかし、Flask ライブラリに関係なく、レンダリングされたテンプレート内の特定のアイテムに ACL を適用する方法が見つかりません。
「機密情報」という名前のボタンがあるが、そのページは誰でも利用できる場合、そのボタンだけを保護するにはどうすればよいですか? render_template
関数は既に呼び出されています。
または、特定のスーパーバイザー レベルの誰かだけが見ることができる編集された一連の情報があり、別のテンプレートを作成したくない場合があります。
近いのは、Jinja2 の contextfilter だけです。
http://jinja.pocoo.org/docs/dev/api/#jinja2.runtime.Context
しかし、私はそれを使用する方法がわかりません。
上記の方法は、少数のグループしかない場合を除き、非常に扱いにくいようです。より大きなセットには、入れ子のグループと優先度が必要になります。