将RoleNeed与Flask Principal相结合

6
我正在尝试创建一个权限,要求用户具有角色A或角色B。
根据Python Flask Principal文档,以下代码行创建了一个需要用户同时拥有角色A和角色B的权限。
combined_permission = Permission(RoleNeed('roleA'), RoleNeed('roleB'))

你知道如何创建一个基于 OR 而不是 AND 的权限吗?
1个回答

9
目前,需要组合权限的需求是使用OR进行检查的。引用文档中的内容:

class flask_principal.Permission(*needs)
表示需要哪些权限才能访问资源

如果您想要使用AND,只需子类化Permission类并覆盖allows方法以检查集合的交集是否与权限的需求相同。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接