针对EasyCVR安防视频云服务平台的用户管理和角色管理方面,我们发现在一些情况下会出现部分通道或者分组无法查看的情况。在上一篇博文中,我们解决了EasyCVR管理员用户无法查看分组下通道信息的问题,本文我们主要处理另一个关于通道分组的问题。
在EasyCVR管理员后台,给用户分配通道过后,通过子用户登录无法查看到该通道所属分组的情况。
通过检查代码,我们发现了问题所在。现在EasyCVR用户管理的逻辑结构是:用户绑定角色,角色绑定通道。然而近期EasyCVR的版本做了更新,更新过后的逻辑为:用户绑定角色,角色绑定分组,分组绑定设备的步骤。由于新旧版本中用户的逻辑管理出现了差异,导致按照旧版本配置的内容不生效。
其实这里还需要对代码进行优化,增加判断条件,当用户角色不是管理员的时候,去查询用户所属角色,角色包含分组,分组拥有的通道。
参考代码如下:
selectStr := fmt.Sprintf(`%s.parent_id,%s.id,%s.name,%s.channel_id,%s.parent_device_id`, labelTableName, labelTableName, labelTableName, channelTableName, channelTableName)
joinStr := fmt.Sprintf(`left join %s on %s.rid=%s.role_id
left join %s on %s.label_id=%s.label_id
left join %s on %s.channel_id=%s.channel_id
and %s.channel_device_id=%s.parent_device_id
left join %s on %s.label_id=%s.id`, roleLabelTableName, userRoleTableName, roleLabelTableName,
labelChannelTableName, roleLabelTableName, labelChannelTableName,
channelTableName, labelChannelTableName, channelTableName, labelChannelTableName, channelTableName,
//roleChannelTableName, channelTableName, labelChannelTableName,
//labelChannelTableName, channelTableName, labelChannelTableName, channelTableName,
labelTableName, labelChannelTableName, labelTableName)
wherestr := fmt.Sprintf(`%s.uid=?`, userRoleTableName)
dbclient = dbclient.Table(userRoleTableName).
Select(selectStr).
Joins(joinStr).
Where(wherestr, uid)
修复后的通道分组则显示正常:
如果大家对EasyCVR感兴趣 ,欢迎持续关注我们的更新。