package middleware import ( "encoding/base64" "gadmin/config" "gadmin/utility/serializer" "gadmin/utility/token" "github.com/gin-gonic/gin" jsoniter "github.com/json-iterator/go" "github.com/sirupsen/logrus" "strconv" "time" ) // 路由白名单 var whitelist = []string{ "/api/gm/userRoles", } // Token 验证token func Token() gin.HandlerFunc { return func(c *gin.Context) { if isWhite(c.Request.URL.Path) { c.Next() return } encodeToken := token.GetAuthorization(c) if encodeToken == "" { c.JSON(200, serializer.CheckLogin()) c.Abort() return } bytesT, err := base64.URLEncoding.DecodeString(encodeToken) if err != nil { logrus.Warningf("middleware base64.URLEncoding.DecodeString:%+v", err.Error()) c.JSON(200, serializer.CheckLogin()) c.Abort() return } t := string(bytesT) tokenKey := config.GetTokenKey(t) if config.TokenRedis.Exists(tokenKey).Val() == 0 { c.JSON(200, serializer.CheckLogin()) c.Abort() return } userStr := config.TokenRedis.Get(tokenKey).Val() user := new(token.UserClaims) if err := jsoniter.UnmarshalFromString(userStr, user); err != nil { c.JSON(200, serializer.CheckLogin()) c.Abort() return } if user.ID == 0 { c.JSON(200, serializer.CheckLogin()) c.Abort() return } // 查询登录token是否有效 now := time.Now() key := config.GetUserTokenKey(user.ID) tokenCTStr := config.TokenRedis.HGet(key, t).Val() tokenCreateTime, err := strconv.Atoi(tokenCTStr) if err != nil { logrus.Warningf("middleware config.LogRedis.HGet:%+v", err.Error()) c.JSON(200, serializer.CheckLogin()) c.Abort() return } tokenCT := time.Unix(int64(tokenCreateTime), 0) if tokenCT.Before(now.Add(-config.TokenExpireTime)) { config.TokenRedis.HDel(key, t) c.JSON(200, serializer.CheckLogin()) c.Abort() return } config.TokenRedis.HSet(key, t, now.Unix()) config.TokenRedis.Expire(key, time.Hour*12) config.TokenRedis.Expire(tokenKey, time.Hour*12) //if os.Getenv("GIN_MODE") == "release" && claims.UserName == "mojun" { // c.JSON(200, serializer.CheckLogin()) // c.Abort() // return //} c.Set("user", user) c.Set("admin_role_id", user.RoleId) c.Next() return } } func isWhite(path string) bool { for _, v := range whitelist { if path == v { return true } } return false }