Flask 基于管理员角色的资源权限

Flask 基于管理员角色的资源权限,flask,wtforms,flask-admin,flask-security,flask-principal,Flask,Wtforms,Flask Admin,Flask Security,Flask Principal,我正在创建一个Flask管理应用程序,它需要检查查看、编辑和删除表中某些行的权限 i、 我想: 仅列出用户ID与行的所有者ID匹配的行 如果用户具有特定角色,则允许用户创建一行 仅当用户具有特定角色时才允许用户编辑行 我可以考虑覆盖方法query()、on_model_change()等来检查编辑许可证,但是: 用户仍然可以通过更改URL以显示编辑屏幕来查看该行 我不知道如何将一对多编辑列表限制为仅允许的项目 我如何才能做到这一点?我自己的问题的快速而肮脏的解决方案: 1。创建一个通用函

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

i、 我想:

  • 仅列出用户ID与行的所有者ID匹配的行
  • 如果用户具有特定角色,则允许用户创建一行
  • 仅当用户具有特定角色时才允许用户编辑行
我可以考虑覆盖方法query()、on_model_change()等来检查编辑许可证,但是:

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

我如何才能做到这一点?

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

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\u model\u change、on\u form\u prefill、on\u model\u delete、get\u query和get\u count\u query方法以检查所有权(user\u id=current\u user.id):


您见过提供基于角色的访问控制的扩展吗?我不知道Flask RBAC,但我不知道它在解决此问题时如何比Flask Security或Flask Principal具有任何优势。
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)