flask数据权限

web项目做权限限制的时候一般是前端权限和后端权限,前端权限又分为路由权限和按钮权限,
这里的前端权限是在前后端分离的基础上,博主使用的是vue框架。后端权限主要是在数据处
理上做限制,形成数据权限。
前端权限比较好做,晚上也有不少博主更新。这里主要说的是在flask的基础上做数据权限,
在使用flask做后端开发时,数据库的增删改查一般都是用orm进行操作,博主想的是既然
要做数据权限就是要在根部进行数据限制,也就是在orm查询的时候进行限制。让用户只
能看到指定数据。
所以博主想的方案是自增orm查询方法,继承自orm原有查询方法(继承filter函数),filter_by
不支持复杂查询方式,所以没用他

#! /usr/bin/python3
# coding=utf-8
import json
import sys

from flask import request
from flask_sqlalchemy import SQLAlchemy, BaseQuery

from apis.permission.redis import r

"""
新增orm查询函数,继承自filter,从redis中取出当前用户的数据权限,
在用户查询数据库时,提前将数据权限加入到查询条件中
filter_by目前没找到复杂查询方式重写
"""


class Query(BaseQuery):

    def permission_filter(self, *criterion):
        list_cri = list(criterion)
        user_name = request.headers['User-Name']
        app_zone = request.headers['App-Zone']
        if user_name:
            cache = r.get('{0}:{1}:data_permissions'.format(user_name, app_zone.strip()))
            if cache:
                cache = json.loads(cache)
                if self.all():
                    class_name = self.first().__class__.__name__
                    if class_name in cache.keys():
                        for key in cache:
                            if key == class_name:
                                data_list = cache.get(key, [])
                                for i in data_list:
                                    if i['data_filter_type'] == 'in':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']].in_(i['data_value']))
                                    elif i['data_filter_type'] == 'not in':
                                        list_cri.append(
                                            ~self.first().__class__.__dict__[i['data_field']].in_(i['data_value']))
                                    elif i['data_filter_type'] == '!=' or i['data_filter_type'] == '<>':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] != i['data_value'])
                                    elif i['data_filter_type'] == '=':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] == i['data_value'])
                                    elif i['data_filter_type'] == '>=':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] >= int(i['data_value']))
                                    elif i['data_filter_type'] == '>':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] > int(i['data_value']))
                                    elif i['data_filter_type'] == '<=':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] <= int(i['data_value']))
                                    elif i['data_filter_type'] == '<':
                                        list_cri.append(
                                            self.first().__class__.__dict__[i['data_field']] < int(i['data_value']))
                                    elif i['data_filter_type'] == 'like':
                                        list_cri.append(self.first().__class__.__dict__[i['data_field']].like(
                                            "%{0}%".format(i['data_value'])))
        criterion = tuple(list_cri)
        return super(Query, self).filter(*criterion)


db = SQLAlchemy(query_class=Query)

在需要做数据权限查询的地方使用permission_filter代码filter进行查询就可以实现数据权限
User.query.permission_filter(User.name==…),博主的数据权限是保存在redis中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值