自从公安部提出了国标GB28181协议之后,国标协议就在视频监控领域特别火热。EasyGBS国标视频云服务平台也是基于国标GB28181协议而生,在安防行业应用比较广泛的视频监控平台。
EasyGBS平台支持国标协议的设备接入,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流进行分发,能够为大数据平台的搭建提供视频能力的支持,在很多线下项目中落地应用。
随着网络安全问题的频发,EasyGBS也增强了对用户安全性的考虑,近期我们在EasyGBS新增了一个IP登陆错误次数的功能,用户登录错误超过一定次数,则锁定对应IP。今天我们来和大家分享一下该功能开发的实现过程。
首先,如果用户名和密码错误,则返回给用户“用户名或密码错误”。
clientMsg := c.ClientIP() + username
if !strings.EqualFold(user.Password, form.Password) {
errorCount(clientMsg)
AbortWithString(c, http.StatusUnauthorized, "用户名或密码错误")
return
}
// 错误统计
func errorCount(msg string) {
if gCfg.LoginErrorLockEnable {
errorLogin, ok := global.LoginError.Get(msg)
preCount := 1
if ok {
preCount = errorLogin.ErrorCount + 1
}
global.LoginError.Set(msg, &global.LoginErrorData{ErrorCount: preCount, LastTime: time.Now().Unix()})
}
}
错误统计的代码原理,是如果用户登录错误,则将对应的 clientMag 添加到缓存中,错误次数加1。
如果错误次数超过配置中的错误次数,则再次调用代码,直接返回不允许调用该接口。
clientMsg := c.ClientIP() + username
if cfg.LoginErrorLockEnable {
errorLogin, ok := global.LoginError.Get(clientMsg)
if ok && uint(errorLogin.ErrorCount+1) > cfg.LoginErrorNumbers {
if errorLogin.LastTime != 0 && time.Now().Unix()-errorLogin.LastTime >= int64(cfg.LoginErrorLockTime*60) {
global.LoginError.Delete(clientMsg)
} else {
errMsg := "IP:" + c.ClientIP() + ",用户:" + username + " 登录密码连续错误多次,请 " + strconv.Itoa(int(cfg.LoginErrorLockTime)) + " 分钟后再试。"
AbortWithString(c, http.StatusBadRequest, errMsg)
return
}
}
}
实现效果如下图所示:
多次登录错误则锁定IP的功能,有利于保障用户账号登录的安全性。
去年我们对EasyGBS、EasyDSS等视频平台陆续更换了新内核版本。新内核版本性能更加稳定,感兴趣的用户可以前往官网进行使用体验。我们也将不定期在博客更新关于EasyGBS平台的功能开发及优化、FAQ、配置操作等内容,欢迎大家关注我们的更新,或留言与我们互动。