【问题标题】:Flask-Admin Role based resource permissionsFlask-Admin 基于角色的资源权限
【发布时间】:2015-10-18 04:05:08
【问题描述】:

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

也就是说,我想:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 您是否见过Flask-RBAC 扩展,它提供了基于角色的访问控制?
  • 我不知道 Flask-RBAC,但我看不出它在解决这个问题方面比 Flask-Security 或 Flask-Principal 有什么优势。

标签: flask wtforms flask-admin flask-security flask-principal


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2023-03-15
    • 2019-01-26
    • 2021-09-16
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多