如何使用Jinja2和Flask在模板级别实现粒度ACL?
如何使用Jinja2和Flask在模板级别实现粒度ACL 这里是我没有Jinja2上下文字典或任何预构建的Flask ACL库的情况下得到的。这是我自己的psuedo 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登录中的当前_用户
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>