4

我正在创建一个 Flask-Admin 应用程序,该应用程序需要检查查看、编辑和删除表中某些行的权限。

即,我想:

  • 仅列出用户 ID 与行的所有者 ID 匹配的行
  • 让用户创建一行,如果他们有一定的角色
  • 仅当用户具有特定角色时才允许用户编辑行

我可以考虑重写方法 query()、on_model_change() 等来检查编辑许可,但是:

  • 用户仍然可以通过更改 URL 以显示编辑屏幕来查看该行
  • 我不知道如何将 WTForms 一对多编辑列表限制为仅允许的项目

我怎样才能做到这一点?

4

1 回答 1

3

对我自己的问题的快速而肮脏的解决方案:

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)
于 2015-07-30T17:03:16.533 回答