Разрешения ресурса 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)