feat:token expire

This commit is contained in:
samwaf
2025-01-31 19:17:25 +08:00
parent 70c775530a
commit ac25ddb270
5 changed files with 45 additions and 9 deletions
+15 -4
View File
@@ -89,15 +89,26 @@ func (w *WafLoginApi) LoginApi(c *gin.Context) {
}
// 密码正确,清除错误计数
global.GCACHE_WAFCACHE.Remove(cacheKey)
//如果存在旧的状态删除
oldTokenInfo := wafTokenInfoService.GetInfoByLoginAccount(req.LoginAccount)
if oldTokenInfo.Id != "" {
wafTokenInfoService.DelApiByAccount(oldTokenInfo.LoginAccount)
//如果存在旧的状态删除 相同帐号 只允许一个
allTokenInfo := wafTokenInfoService.GetAllTokenInfoByLoginAccount(req.LoginAccount)
if allTokenInfo != nil {
for i := 0; i < len(allTokenInfo); i++ {
oldTokenInfo := allTokenInfo[i]
if oldTokenInfo.Id != "" {
wafTokenInfoService.DelApiByAccount(oldTokenInfo.LoginAccount)
global.GCACHE_WAFCACHE.Remove(enums.CACHE_TOKEN + oldTokenInfo.AccessToken)
}
}
}
//记录状态
accessToken := utils.Md5String(uuid.NewV4().String())
tokenInfo := wafTokenInfoService.AddApi(bean.LoginAccount, accessToken, c.ClientIP())
//令牌记录到cache里
global.GCACHE_WAFCACHE.SetWithTTl(enums.CACHE_TOKEN+accessToken, *tokenInfo, time.Duration(global.GCONFIG_RECORD_TOKEN_EXPIRE_MINTUTES)*time.Minute)
//通知信息
noticeStr := fmt.Sprintf("登录IP:%s 归属地区:%s", clientIP, clientCountry)
global.GQEQUE_MESSAGE_DB.Enqueue(innerbean.OperatorMessageInfo{
+1
View File
@@ -4,4 +4,5 @@ const (
CACHE_LOGIN_ERROR = "CACHE_LOGIN_ERROR" //登录密码错误
CACHE_NOTICE_PRE = "CACHE_NOTICE_PRE" //通知前缀
CACHE_CCVISITBAN_PRE = "CACHE_CCVISITBAN_PRE_" //CC封禁前缀
CACHE_TOKEN = "CACHE_TOKEN" //鉴权信息
)
+2
View File
@@ -23,4 +23,6 @@ var (
//GCONFIG_RECORD_PATCH_VERSION_CORE int64 = 20250106 // 核心数据库补丁日期
//GCONFIG_RECORD_PATCH_VERSION_LOG int64 = 20250106 // 日志数据库补丁日期
GCONFIG_RECORD_ALL_SRC_BYTE_INFO int64 = 0 //记录原始信息(默认不开启)
GCONFIG_RECORD_TOKEN_EXPIRE_MINTUTES int64 = 5 //令牌有效期 单位分钟
)
+20 -5
View File
@@ -2,10 +2,15 @@ package middleware
import (
"SamWaf/common/zlog"
"SamWaf/enums"
"SamWaf/global"
"SamWaf/model"
"SamWaf/model/common/response"
"SamWaf/service/waf_service"
"fmt"
"github.com/gin-gonic/gin"
"strings"
"time"
)
var (
@@ -31,16 +36,26 @@ func Auth() gin.HandlerFunc {
c.Abort()
return
} else {
bean := wafTokenInfoService.GetInfoByAccessToken(tokenStr)
if bean.Id == "" {
//检查是否存在
isTokenExist := global.GCACHE_WAFCACHE.IsKeyExist(enums.CACHE_TOKEN + tokenStr)
if !isTokenExist {
response.AuthFailWithMessage("非法口令", c)
c.Abort()
return
} else {
tokenInfo := global.GCACHE_WAFCACHE.Get(enums.CACHE_TOKEN + tokenStr).(model.TokenInfo)
if tokenInfo.LoginIp != c.ClientIP() {
zlog.Error(fmt.Sprintf("登录IP不一致,请求拒绝,原IP:%v 当前IP:%v", tokenInfo.LoginIp, c.ClientIP()))
global.GCACHE_WAFCACHE.Remove(enums.CACHE_TOKEN + tokenStr)
response.AuthFailWithMessage("本次登录IP和上次登录IP不一致需要重新登录", c)
c.Abort()
return
} else {
//刷新token时间
global.GCACHE_WAFCACHE.SetWithTTl(enums.CACHE_TOKEN+tokenStr, tokenInfo, time.Duration(global.GCONFIG_RECORD_TOKEN_EXPIRE_MINTUTES)*time.Minute)
}
}
}
//zlog.Debug("有token:" + tokenStr)
// 将 claims 中的用户信息存储在 context 中
//c.Set("userId", claims.UserId)
// 这里执行路由 HandlerFunc
c.Next()
+7
View File
@@ -61,6 +61,13 @@ func (receiver *WafTokenInfoService) GetInfoByLoginAccount(loginAccount string)
return bean
}
// GetAllTokenInfoByLoginAccount 通过登录account获取账号信息
func (receiver *WafTokenInfoService) GetAllTokenInfoByLoginAccount(loginAccount string) []model.TokenInfo {
var bean []model.TokenInfo
global.GWAF_LOCAL_DB.Where("login_account=? ", loginAccount).Find(&bean)
return bean
}
/*
*
获取一个可用的token TODO 将来应该是一个