flask-login中基于角色的授权

问题描述 投票:0回答:1

我需要在现有的Flask应用程序中引入基于角色的授权。因此,我不能仅将当前使用的flask-login软件包与flask-user交换。不过,我必须将某些端点的访问权限限制为“管理员”用户,而无需重建整个代码库。

我想出了这样的装饰器:

def admin_required(func):
    """
    Modified login_required decorator to restrict access to admin group.
    """

    @wraps(func)
    def decorated_view(*args, **kwargs):
        if current_user.group != 0:        # zero means admin, one and up are other groups
            flash("You don't have permission to access this resource.", "warning")
            return redirect(url_for("main.home"))
        return func(*args, **kwargs)
    return decorated_view

我将其与原始的login_required装饰器一起使用:

@app.route("/admin-restricted"):
@login_required
@admin_required
def admin_resource():
    return "Hello admin"

一切正常,但是我有两个问题:

  1. 我的方法安全吗?我是否错过了潜在的安全漏洞?不幸的是,我对Flask的内部知识了解有限。
  2. 是否有更简单/安全/ pythonic的方法?我只是觉得不对劲。
python flask flask-login
1个回答
0
投票

处理基于角色的权限的更常见方法是使用Flask Principal。

在主应用中:

from flask_principal import Principal

# load the extension
principals = Principal(app)

@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):
    # Set the identity user object
    identity.user = current_user
    # Add the UserNeed to the identity
    if hasattr(current_user, 'employee_id'):
        identity.provides.add(UserNeed(current_user.employee_id))

    # Assuming the User model has a list of roles, update the
    # identity with the roles that the user provides
    if hasattr(current_user, 'position'):
        # for role in current_user.role:
        identity.provides.add(RoleNeed(str(current_user.position)))

   admin_permission = Permission(RoleNeed('admin'))

然后在路线上:

@app.route("/admin-restricted"):
@login_required
@admin_permission.require(http_exception=403)
def admin_resource():
    return "Hello admin"

文档:https://pythonhosted.org/Flask-Principal/

© www.soinside.com 2019 - 2024. All rights reserved.