视频监控联网RTSP平台EasyNVR用户管理权限与实际权限不匹配,该如何排查?
时间:2022-07-23
本文章向大家介绍视频监控联网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通道的数据,用户权限恢复正常。
- 一款轻量级Web漏洞教学演示系统(DSVW)
- 使用Burpsuite代理和pypcap抓包进行抢红包的尝试
- 基于WAVSEP的靶场搭建指南
- 【干货】大数据量下,58同城mysql实践!
- 如何预先处理电影评论数据以进行情感分析
- 如何在Python中从零开始实现随机森林
- 教程从头开始在Python中实现k最近邻居
- 建立安全的 AI
- Python NLTK 自然语言处理入门与例程
- 漏洞预警 | Apache Struts2 曝任意代码执行漏洞 (S2-045,CVE-2017-5638)
- 详解OSSIM-OSSEC WIN 4771案例
- JSShell:一个基于python的交互式Shell
- golang中操作excel
- 企业安全漏洞通告引擎
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Sliding Window - 395. Longest Substring with At Least K Repeating Characters
- Sliding Window - 340. Longest Substring with At Most K Distinct Characters
- Sliding Window - 3. Longest Substring Without Repeating Characters
- Sliding Window - 30. Substring with Concatenation of All Words
- Sliding Window - 76. Minimum Window Substring
- GET和POST的区别
- String - 68. Text Justification
- String - 273. Integer to English Words
- String - 12. Integer to Roman
- Dynamic Programming - 62. Unique Paths
- Dynamic Programming - 70. Climbing Stairs
- LinkedList - 23. Merge k Sorted Lists
- LinkedList - 86. Partition List
- LinkedList - 148. Sort List
- LinkedList - 61. Rotate List