2

如何使用 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

但是,我不确定如何使用它。

除非只有几个组,否则我上面的方式似乎非常难以管理。较大的集合将需要嵌套组和优先级。

4

0 回答 0