如何使用 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
但我找不到的是如何将 ACL 应用于呈现模板中的特定项目,而不管任何 Flask 库。
如果我有一个名为“秘密信息”的按钮,但该页面可供所有人使用,我该如何保护该按钮?该render_template
函数已被调用。
或者,有时我可能有一组只有特定主管级别的人才能看到的编辑信息,我不想创建单独的模板。
唯一接近的是 Jinja2 的 contextfilter,
http://jinja.pocoo.org/docs/dev/api/#jinja2.runtime.Context
但是,我不确定如何使用它。
除非只有几个组,否则我上面的方式似乎非常难以管理。较大的集合将需要嵌套组和优先级。