如何在模板级别使用Jinja2和Flask实现粒度ACL?
如果没有Jinja2上下文字典或任何预先构建的Flask ACL库,我就会拥有这些内容。这是我自己的psuedo 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库。
如果我有一个名为&#34的按钮;秘密信息,&#34;但是每个人都可以使用该页面,我该如何保护该按钮? render_template
函数已被调用。
或者,有时候我可能会有一组编辑的信息,只有某个主管级别的人才能看到,而且我不想创建单独的模板。
唯一接近的是Jinja2的contextfilter,
http://jinja.pocoo.org/docs/dev/api/#jinja2.runtime.Context
但是,我不确定如何使用它。
除非只有少数几个团体,否则上面的方式似乎非常难以管理。较大的集合将需要嵌套组和优先级。