将RoleNeed与Flask Principal结合起来

时间:2015-04-07 20:06:24

标签: python permissions flask acl flask-principal

我尝试创建一个要求用户具有角色A或角色B的权限。

根据Python Flask Principal文档,以下行创建了一个权限,要求用户具有roleA和roleB。

combined_permission = Permission(RoleNeed('roleA'), RoleNeed('roleB'))

您是否知道如何创建依赖于OR而非AND?

的权限

1 个答案:

答案 0 :(得分:6)

目前的情况是,使用OR检查组合权限的需求。引自the documentation

  

class flask_principal。权限(* 需要
  表示需要,其中任何一个必须存在才能访问资源

如果你想要一个AND,只需简单地对Permission类进行子类化并覆盖the allows method,以检查这些集合的交集是否与该权限的需要相同。第一名:

class RequiresAll(Permission):
    def allows(self, identity):
        if not has_all(self.needs, identity.provides):
            return False

        if self.excludes and self.excludes.intersection(identity.provides):
            return False

        return True

def has_all(needed=None, provided=None):
    if needed is None:
        return True

    if provided is None:
        provided = set()

    shared = needed.intersection(provided)
    return shared == needed