限制访问烧瓶视图的某些区域的功能是按角色吗?

时间:2014-02-20 00:44:51

标签: python flask roles

我写了这个,看起来效果很好:

@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
    if not current_user.role == ROLE_ADMIN:
        flash('You do not have access to view this page.')
        return redirect(url_for('index'))
...the rest of my code...

虽然我试图简化一些事情,因为我不想将这三行添加到我想要只对管理员可见的每个区域,我试着把它放在一个像这样的函数中:

def admin_only():
    if not current_user.role == ROLE_ADMIN:
        flash('You do not have access to view this page.')
        return redirect(url_for('index'))

然后放入我的视图功能:

@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
    admin_only()
...the rest of my code....

然而,这并不像我预期的那样有效。我收到了闪烁的消息,但它并没有像我想象的那样重定向。

所以,有两个问题:

  1. 为什么返回的重定向不起作用?
  2. 有更好的方法来实现此功能吗?

1 个答案:

答案 0 :(得分:4)

实际回答你的问题。您应该使admin_only函数成为装饰器并装饰admin视图方法。它现在不重定向的原因是因为您没有从视图返回重定向。

def admin():
    ret = admin_only()
    if( not ret ):
        return ret
....

这应该可以解决您当前的问题,但这并不理想,您希望的功能应该转移到装饰器。

我还建议如下:

查看Flask-Principal它可以为用户分配角色,然后根据这些角色将访问权限限制在您的视图中。

与Flask-Principal一起看看Flask-Security,因为它提供了许多与安全相关的有用Flask扩展,并且使其更易于使用。

使用示例:

@roles_required( "admin" )
def website_control_panel():
    return "Only Admin's can see this."

是否允许角色为admin的用户加入其帐户。另一个用例是允许用户拥有可以使用roles_accepted指定的许多角色之一,并可以按如下方式使用:

@roles_accepted( "journalist", "editor" )
def edit_paper():
    return render_template( "paper_editor.html", ... )

仅允许至少有journalisteditor个角色中的一个与其帐户绑定的用户。