我正在创建一个 Flask-Admin 应用程序,该应用程序需要检查查看、编辑和删除表中某些行的权限。
即,我想:
- 仅列出用户 ID 与行的所有者 ID 匹配的行
- 让用户创建一行,如果他们有一定的角色
- 仅当用户具有特定角色时才允许用户编辑行
我可以考虑重写方法 query()、on_model_change() 等来检查编辑许可,但是:
- 用户仍然可以通过更改 URL 以显示编辑屏幕来查看该行
- 我不知道如何将 WTForms 一对多编辑列表限制为仅允许的项目
我怎样才能做到这一点?
我正在创建一个 Flask-Admin 应用程序,该应用程序需要检查查看、编辑和删除表中某些行的权限。
即,我想:
我可以考虑重写方法 query()、on_model_change() 等来检查编辑许可,但是:
我怎样才能做到这一点?
对我自己的问题的快速而肮脏的解决方案:
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)