zoukankan      html  css  js  c++  java
  • 视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?

    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通道的数据,用户权限恢复正常。

  • 相关阅读:
    界面开发注意要素,降低界面BUG
    软件测试及其重要性
    浅谈自动化测试工具之Selenium
    浅谈探索式软件测试
    浅谈功能测试流程
    关于软件测试中测试用例的重要性
    第1章 性能测试整体认知
    数据库对比,优化
    2、补充介绍
    1、MarkDown基本语法
  • 原文地址:https://www.cnblogs.com/EasyNVR/p/13474107.html
Copyright © 2011-2022 走看看