如何在模板级别使用Jinja2和Flask实现粒度ACL?

时间:2015-04-30 17:16:22

标签: flask jinja2 acl flask-security

如何在模板级别使用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

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

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

0 个答案:

没有答案