EasyNVR视频平台的登录方式有两种,一种是用户名登录,也就是需要输入用户名密码,一般在企业内部,管理人员可以设置可登录人员,并分配用户名和密码用于登录;另一种就是匿名登陆,这种登录方式相当于游客登录,匿名登录状态下,游客可以查看内容,但不能添加设备做配置,当然,实际使用时如果不需要此功能,在我们登录鉴权页面是可以关闭匿名登陆的。
今天,与大家分享的是TSINGSEE青犀视频团队在浏览器测试EasyNVR新版功能的时候,偶然发现在匿名登陆下,设备分组下并不显示设备资源,而在用户登陆下就能够正常显示。
我调出了开发者模式,通过浏览器观察调用接口的返回数据,可以看到使用匿名登陆查看接口返回的数据为空,所以在前端没有显示内容。
而使用管理员登录查看接口返回的数据是有内容的。
由此可知,是后端返回数据导致的使用匿名登录为空,从而导致前端设备分组资源为空。于是我看了下后端代码,发现是此处逻辑有问题,游客账号和管理员账号拥有一样的权限,缺少了对游客账号的判断。
if uname != defAdminUser {
selectStr := fmt.Sprintf(`%s.label_id,%s.name as label_name`, labelChannelTableName, labelTableName)
joinStr := fmt.Sprintf(`left join %s on %s.rid=%s.role_id left join %s on %s.camera_id=%s.id
left join %s on %s.camera_id=%s.id
left join %s on %s.label_id=%s.id`, roleChannelTableName, userRoleTableName, roleChannelTableName, channelTableName, roleChannelTableName, channelTableName,
labelChannelTableName, labelChannelTableName, channelTableName, labelTableName,
labelChannelTableName, labelTableName)
wherestr := fmt.Sprintf(`%s.uid=?`, userRoleTableName)
dbclient = dbclient.Table(userRoleTableName).
Select(selectStr).
Joins(joinStr).
Where(wherestr, uid)
} else {
selectStr := fmt.Sprintf(`%s.label_id,%s.name as label_name`, labelChannelTableName, labelTableName)
joinStr := fmt.Sprintf(`left join %s on %s.camera_id=%s.id left join %s on %s.label_id=%s.id`,
labelChannelTableName, labelChannelTableName, channelTableName, labelTableName, labelChannelTableName, labelTableName)
dbclient = dbclient.Table(channelTableName).
Select(selectStr).
Joins(joinStr)
}
修改逻辑后,修改代码为:
if uname != defAdminUser && uname != defGuestUser {
selectStr := fmt.Sprintf(`%s.label_id,%s.name as label_name`, labelChannelTableName, labelTableName)
joinStr := fmt.Sprintf(`left join %s on %s.rid=%s.role_id left join %s on %s.camera_id=%s.id
left join %s on %s.camera_id=%s.id
left join %s on %s.label_id=%s.id`, roleChannelTableName, userRoleTableName, roleChannelTableName, channelTableName, roleChannelTableName, channelTableName,
labelChannelTableName, labelChannelTableName, channelTableName, labelTableName,
labelChannelTableName, labelTableName)
wherestr := fmt.Sprintf(`%s.uid=?`, userRoleTableName)
dbclient = dbclient.Table(userRoleTableName).
Select(selectStr).
Joins(joinStr).
Where(wherestr, uid)
} else {
selectStr := fmt.Sprintf(`%s.label_id,%s.name as label_name`, labelChannelTableName, labelTableName)
joinStr := fmt.Sprintf(`left join %s on %s.camera_id=%s.id left join %s on %s.label_id=%s.id`,
labelChannelTableName, labelChannelTableName, channelTableName, labelTableName, labelChannelTableName, labelTableName)
dbclient = dbclient.Table(channelTableName).
Select(selectStr).
Joins(joinStr)
}
修改过后匿名登陆的情况下也可以显示设备资源了:
EasyNVR流媒体解决方案
EasyNVR是由TSINGSEE青犀视频团队自主研发,它能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP/HLS,进行全平台终端H5直播(Web、Android、iOS),并且EasyNVR能够将视频源的直播数据对接到第三方CDN网络,实现互联网级别的直播分发,EasyNVR的主要建设目标是将各种各样的安防摄像机、NVR进行统一接入和管理,并控制流的按需输出,对全平台终端提供统一的标准H5流输出。