2015-04-07 2 views
4

Я пытаюсь создать разрешение, которое требует, чтобы пользователь имеет роль A или B. РольСочетание RoleNeed с Колба Принципала

Согласно Python Flask Principal документации, следующая строка создает разрешение, которое требует, чтобы пользователь имеет roleA И roleB.

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

Вы знаете, как создать разрешение, основанное на OR вместо AND?

ответ

5

Как и в настоящее время, потребности в объединенном разрешении проверяются с помощью OR. Цитируя the documentation:

класса 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