满口金牙 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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料