Разрешения ресурса Flask-Admin на основе ролей

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

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

  • Перечислите только те строки, в которых идентификатор пользователя совпадает с идентификатором владельца строки
  • Позвольте пользователю создать строку, если у него есть определенная роль
  • Разрешить пользователю редактировать строку только при наличии определенной роли

Я могу подумать о переопределении методов query(), on_model_change() и т. Д. Для проверки разрешения на редактирование, но:

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

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

1 ответ

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

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

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. Переопределите методы ModelView 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)
Другие вопросы по тегам