2015-07-27 9 views
4

Я создаю приложение Flask-Admin, которое требует проверки разрешений для просмотра, редактирования & Удаление определенных строк в таблице.Flask-Admin Ролевые разрешения ресурсов

т.е. я хотел бы:

  • списка только те строки, где идентификатор пользователя совпадает с ID владельца из строки
  • Пусть пользователь Создайте строку, если они имеют определенную роль
  • только пусть пользователя редактирования строки, если они имеют определенную роль

я могу думать переопределение методов запроса(), on_model_change() и т.д., чтобы проверить разрешение на Edit, но:

  • Пользователь может по-прежнему просматривать строку, изменив URL, чтобы отобразить экран редактирования
  • Я не знаю, как для ограничения WTForms один-ко-многим редактировать список только разрешенных пунктов

Как я могу это достичь?

+1

Вы видели расширение [** Flask-RBAC **] (https://flask-rbac.readthedocs.org/en/latest/), которое дает контроль доступа на основе роли? – doru

+0

Я не знал Flask-RBAC, но я не вижу, как это дает преимущество над Flask-Security или Flask-Principal в решении этой проблемы. – Rafael

ответ

2

быстрое и грязное решение моей проблемы:

1. Создать общую функцию для проверки владения в классе видовую

def is_owned(self, id): 
    model = db.session.query(self.model).filter(self.model.id == id).all() 
    if len(model) == 0: 
     return False 
    else: 
     model = model[0] 
    if model.user_id == current_user.id: 
     return True 
    return False 

2. Override'S on_model_change видового, on_form_prefill, on_model_delete, get_query и get_count_query, чтобы проверить право собственности (user_id = current_user.id):

def on_model_change(self, form, model, is_created): 
    if not self.is_owned(model.id): 
     abort(403) 

def on_form_prefill(self, form, id): 
    if not self.is_owned(id): 
     abort(403) 

def on_model_delete(self, model): 
    if not self.is_owned(model.id): 
     abort(403) 

def get_query(self): 
    return super(Tables, self).get_query().filter(self.model.user_id == current_user.id) 

def get_count_query(self): 
    return super(Tables,self).get_count_query().filter(self.model.user_id == current_user.id) 

 Смежные вопросы

  • Нет связанных вопросов^_^