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

如何使用Jinja2和Flask在模板级别实现粒度ACL?,flask,jinja2,acl,flask-security,Flask,Jinja2,Acl,Flask Security,如何使用Jinja2和Flask在模板级别实现粒度ACL 这里是我没有Jinja2上下文字典或任何预构建的Flask ACL库的情况下得到的。这是我自己的psuedo ACL,我只需在数据库中查询角色,并将其放入索引函数 (来源修改自) def index(): user={'nickname':'Miguel'}假冒用户 acl={'role':'Supervisor'}我还没有看到一个库可以做到这一点。乍一看,我的方法是在用户模型上放置一个静态方法,以便您可以使用Flask登录中的当前_用户

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

这里是我没有Jinja2上下文字典或任何预构建的Flask ACL库的情况下得到的。这是我自己的psuedo ACL,我只需在数据库中查询角色,并将其放入索引函数

(来源修改自)

def index():
user={'nickname':'Miguel'}假冒用户

acl={'role':'Supervisor'}我还没有看到一个库可以做到这一点。乍一看,我的方法是在用户模型上放置一个静态方法,以便您可以使用Flask登录中的当前_用户objecf来检查他们的角色。因此,在模板中,如果当前_user.getACL=='Super'%},则代码看起来像{%。所有ACL逻辑都将在静态方法中。也许有更好的方法,但这是我首先要尝试的。Jinja2如何知道如何使用这种方法?如果我理解你的话,我可以向它传递一个类似“current_user.getACL”的函数吗。我猜细粒度安全性不是标准。这是很少见的吗?看看吧。主要特性之一是用户代理,它允许您在python代码和Jinja中访问当前用户的对象。您可以直接访问用户模型中的数据,然后还可以运行用户模型中定义的函数。根据我的经验,基于角色的访问通常不超过3-4个角色。您是否想知道如何构造
{%if some_acl_related_condition%}
的条件,或者您想知道如何在没有该条件的情况下实现它?@dirn我首先要问的是如何实现acl。我给出了一个看起来可行的方法,但我不知道。
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>