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中