满口金牙 2021-12-31 17:55 采纳率: 91.5%
浏览 39
已结题

django 复杂权限的实现方法,感觉很low,请教好思路

由权限比较复杂, 部门间,科室间的数据要相互不可见,
光查询权限就有, 查所有部门,只能查某部门,只查询部门里的某科室,只查看某个项目,,
我现在是思路是把 权限 嵌入到 filter参数中,可以用,但感觉很Low
希望有经验的朋友 给个好的建议或方法


class ProjectView(APIView):
    throttle_classes = []
    def get(self,request):
        print('get++++++++++++++++++get+++++++:')
        # 过滤参数
        filter_list = {}
        # 获取用户权限.从user 表中 获取用户的各项权限
        user_type = request.user.user_type # 用户类型
        permission_query = request.user.permission_query # 查询部门权限
        permission_content = request.user.permission_content # 内容权限
        # 查询权限-----部门过滤-------------------------------------------
        branch = re.match(r"([^/]*)/?([^/]*)?", permission_query[0]['label']) # permission_query数据格式 [{label:'部门名/科室名'}] 或 [{label:'部门名'}] 

        if branch.group(1) != '所有部门':
            # 假如不是所有部门, 就增加部门或科室名称 做为 查找条件,
            if branch.group(1) : filter_list['branch_name'] = branch.group(1) 
            if branch.group(2) : filter_list['department_name'] = branch.group(2)
                
        # 内容权限  (名称过滤)-------------------------------------------
        if permission_content: 
            project_name = request.query_params.get('project_name')
            # 当用户设定了查询条件, 且包含在权限内,使用用户的查询条件
            if project_name and project_name.find(permission_content) != -1:
                filter_list['project_name__contains'] = project_name
            # 否则使用内容权限的做为查询条件  
            else:
                filter_list['project_name__contains'] = permission_content
                
                
        # 不确定用户还有什么查询条件, 尝试获取一遍,这里很low
        serial_number = request.query_params.get("serial_number") #编号
        orderdate_gte = request.query_params.get("order_date_gte") # 日期范围
        orderdate_lte = request.query_params.get("order_date_lte") # 日期范围
        client_number =  request.query_params.get('client_number') # 客户编号
        is_active = request.query_params.get('is_active') # 激活状态
        category_name = request.query_params.get('category_name') # 一级分类
        # 假如有下面的 查询条件,就加入 过滤参数
        if is_active == 'true': 
            filter_list['is_active'] = True
        elif is_active == 'false':
            filter_list['is_active'] = False 
        if serial_number: filter_list['serial_number'] = serial_number
        else:    
            if orderdate_gte and orderdate_lte:
                filter_list['order_date__range'] = [orderdate_gte, orderdate_lte]
            elif orderdate_gte:
                filter_list['order_date'] = orderdate_gte
            elif orderdate_lte:
                filter_list['order_date'] = orderdate_lte
            if client_number: filter_list['client_number'] = client_number  
            if category_name: filter_list['category_name'] = category_name
  
        query_list = ProjectInfo.objects.filter(**filter_list)
        serializer = ProjectSerializer(instance = query_list, many= True)
        return Response(serializer.data, status=status.HTTP_200_OK)

**我也曾尝试把权限放在 session 里,但可能存在漏洞,session可以在Html中改写
Django - DRF - BasePermission 权限组件 好象只能针对某个 视图函数。

**

  • 写回答

3条回答 默认 最新

  • Rattenking Python领域优质创作者 2021-12-31 20:22
    关注

    权限这种,不要从前端穿给后端,而是将用户信息,权限等存入表里,然后将这些信息生成token,返回给前端,前端要用户信息等就用token掉接口查询。你要看用户权限,就让前端穿token给你,你再用token去表里查用户权限。千万不要让前端给你传,不安全!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 12月31日

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?