Flask-AppBuilder限制登录用户仅查看自有数据的实现方案是否正确
方案有效性说明
你当前的自定义过滤器+base_filters配置属于可行方案,能够正常实现「登录用户仅查看自身关联Account记录」的需求,逻辑本身没有错误。但该方案确实不是Flask-AppBuilder(以下简称FAB)官方推荐的标准实现,手动配置每个视图的方式确实存在安全规则遗漏的风险。
FAB官方标准实现方案
FAB框架本身已经内置了专属的用户数据隔离能力,不需要自定义过滤器,同时可以通过基类继承的方式实现全局规则复用,完全避免配置遗漏问题:
步骤1:定义全局数据隔离基类
所有需要按登录用户隔离数据的ModelView统一继承该基类,一次配置全局生效:
from flask import g from flask_appbuilder.models.filters import OwnerFilter from flask_appbuilder.views import ModelView class UserIsolatedBaseView(ModelView): # 全局配置用户归属过滤规则,自动适配当前登录用户 base_filters = [["user", OwnerFilter, lambda: None]] def pre_add(self, item): # 新增记录时自动绑定当前登录用户,无需用户手动选择关联 item.user = g.user
步骤2:业务视图直接继承基类即可
不需要在每个业务视图中重复配置过滤规则:
class AccountModelView(UserIsolatedBaseView): datamodel = SQLAInterface(Account) list_columns = ["identifier", "alias", "brokerage.name"] add_columns = ["identifier", "alias", "brokerage"] edit_columns = ["identifier", "alias", "brokerage"]
特殊场景适配
如果你的模型中关联用户的字段名不是user,只需要修改base_filters中第一个参数为对应字段名即可,比如字段名为creator时,配置改为:
base_filters = [["creator", OwnerFilter, lambda: None]]
补充说明
官方内置的OwnerFilter逻辑和你自定义的过滤器逻辑完全一致,但是经过框架官方安全验证,避免自定义代码可能存在的边界问题,同时基类复用的方式彻底解决了手动配置遗漏的安全风险。
内容的提问来源于stack exchange,提问作者Jason Strimpel
相关产品推荐
相关产品推荐

