caravel 控制某角色只能看到自己的表

背景:

      每个用户应该只能看到自己有权限的表,但是我拿到这个版本的时候 caravel还没做限制,即用户可以看到所有表。

     然后我就用自己的方法 限制了,如下:

    

#views.py


class FilterTables(CaravelFilter):
    def apply(self, query, func):  # noqa
        if any([r.name in ('Admin', 'Alpha') for r in get_user_roles()]):
            return query
        sql="""
            select * from ab_view_menu where id in 
                (select view_menu_id from ab_permission_view where id in 
                    (select permission_view_id from ab_permission_view_role where role_id=5) 
                    and permission_id=31
                )
        """
        logging.info(sql)
        result=db.session.execute(sql)
        idsinfo=result.fetchall()
        ids=[]
        for item in idsinfo:
             ids.append(item[1].split(':')[1].split(')')[0])
        qry = query.filter(self.model.id.in_(ids))
        return qry

增加了一个内部类之后,调用:

#views TableModelView 代码段中调用
    base_filters = [['id', FilterTables, lambda: []]]
    #post_add(self, table)函数前



当当当当,完毕。




回到GitHub上看了一眼,呀,版本升级,已经实现了呀。

看了下代码,人家风格更统一呢,

你看人家是这样写的:

#views.py

class TableSlice(CaravelFilter):
    def apply(self, query, func):  # noqa
        if any([r.name in ('Admin', 'Alpha') for r in get_user_roles()]):
            return query
        perms = self.get_perms()
        tables = []
        for perm in perms:
            match = re.search(r'\(id:(\d+)\)', perm)
            tables.append(match.group(1))
        qry = query.filter(self.model.id.in_(tables))
        return qry


#views.py 调用
    base_filters = [['id', TableSlice, lambda: []]]



都可以哦~ 你可以自己看情况来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值