前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?

视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?

作者头像
EasyNVR
发布2020-08-12 15:58:56
7450
发布2020-08-12 15:58:56
举报
文章被收录于专栏:EasyNVREasyNVR

TSINGSEE团队将视频平台进行改版之后,增加了角色管理和用户管理的功能,包括EasyGBS、EasyNVR等平台,大家可以重温下这篇文章:新版国标流媒体服务器能否区分用户进行用户管理?

改版之后的平台同时存在用户管理和角色管理,多个用户可以有同一个角色,每个角色可以分配多个设备,从而形成一个良性的分级管理关系。正常来说,用户管理处可以添加用户,且有对应的角色,权限设置了多少通道,就能看查看并管理这些通道。

我们对此功能也进行了一些测试,设置一个用户user1,并分配该用户通道Channel1的权限,因此通过查看user1用户的权限是只拥有一个通道Channel1,但是录像回看列表数据却显示所有的通道,这显然是权限不对应。

分析问题

1、通过使用超级管理员登录查看录像回看列表是拥有全部的通道数据,此时是正确的; 2、查看前端渲染数据是否正常; 3、前端渲染数据没有问题后观察后端接口,通过断点调试发现是此处代码逻辑有问题,因此在此处需要进行修复。

解决问题

func (h *APIHandler) QueryRecordDevices(c *gin.Context) {
   params := make(map[string]string)
   for k, v := range c.Request.URL.Query() {
      params[strings.ToLower(k)] = strings.Join(v, ",")
   }
   files, _ := ioutil.ReadDir(dss.RecordDir())
   devs := make([]*DeviceInfo, 0)
   //
   dbclient := nvrdao.GetDB()
   session := sessions.Default(c)
   uname := session.Get("uname") //"admin" //
   sechttp := utils.Conf().Section("default")
   defAdminUser := sechttp.Key("default_user").MustString("easygbs")
   defGuestUser := sechttp.Key("default_guest_user").MustString("guest2020")
   var results = make([]string, 0)
   var is_cunzai = false
   if uname != defAdminUser && uname != defGuestUser {
      selectsql := fmt.Sprintf(`%s.camera_id`, models.RoleCamera{}.TableName())
      joins1 := fmt.Sprintf(`left join %s on %s.id = %s.uid`, models.UserRole{}.TableName(),
         models.User{}.TableName(), models.UserRole{}.TableName())
      joins2 := fmt.Sprintf(`left join %s ON %s.rid = %s.role_id`, models.RoleCamera{}.TableName(),
         models.UserRole{}.TableName(), models.RoleCamera{}.TableName())
 
      wheresql := fmt.Sprintf(`%s.username='%s'`, models.User{}.TableName(), uname)
      dbclient.Table(models.User{}.TableName()).Select(selectsql).
         Where(wheresql).
         Joins(joins1).
         Joins(joins2).Pluck("camera_id", &results)
   } else {
      is_cunzai = true
   }
 
   //
   for _, file := range files {
      isHave := false
      if file.IsDir() {
 
         devName := file.Name()
         var channel uint
         var info models.Camera
         if n, err := fmt.Sscanf(file.Name(), "stream_%d", &channel); err == nil && n == 1 {
            models.DB.Table("camera").First(&info, channel)
         }
         if !models.DB.NewRecord(info) {
            devName = info.Name
         }
         for _, v := range results {
            if v == strconv.Itoa(int(channel)) {
               isHave = true
            }
         }
         if is_cunzai || isHave {
            if strings.Contains(strings.ToLower(devName), strings.ToLower(params["q"])) || params["q"] == fmt.Sprintf("%d", channel) {
               devs = append(devs, &DeviceInfo{
                  ID:       channel,
                  Name:     devName,
                  UpdateAt: utils.DateTime(file.ModTime()),
               })
            }
         }
      }
   }
   pr := utils.NewPageResult(devs).Sort(params["sort"], params["order"])
   start, _ := strconv.Atoi(params["start"])
   limit, _ := strconv.Atoi(params["limit"])
   if limit > 0 {
      pr.Slice(start, limit)
   }
   c.IndentedJSON(http.StatusOK, gin.H{
      "total": pr.Total,
      "rows":  pr.Rows,
   })
}

此时在通过user1用户登录查看录像回看列表数据就只有Channel1通道的数据,用户权限恢复正常。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析问题
  • 解决问题
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档