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

Posted

技术标签:

【中文标题】按角色限制对烧瓶视图功能的某些区域的访问?【英文标题】:Restricting access to certain areas of a flask view function by role? 【发布时间】:2014-03-20 16:33:07 【问题描述】:

我写了这个,它似乎工作得很好:

@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...

在尝试简化事情时,因为我不想将这 3 行添加到我只想对管理员可见的每个区域,我尝试将它放在这样的函数中:

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】:

真正回答你的问题。您应该使 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 角色之一的用户。

【讨论】:

感谢您的彻底帮助!我会检查那些包。 代码第一部分的否定应该被删除,因为它仍然显示受限视图

以上是关于按角色限制对烧瓶视图功能的某些区域的访问?的主要内容,如果未能解决你的问题,请参考以下文章

页面不可用 你的IT管理员已限制对对此应用的某些区域的访问,并且你尝试访问的项目不可用。

限制对烧瓶 REST API 的访问

如何限制对 Access 中某些列的访问

如何限制对当前文件的某些功能或对象的访问?

应用弹簧安全 - 这种用法正确吗?

Laravel 4 身份验证。限制对资源的某些功能的访问,但不是全部