package middleware import ( "encoding/json" "github.com/gin-gonic/gin" "go_zh/model" "go_zh/server" "net/http" ) // 不需要token验证的路由白名单 var whiteList = []string{ "/api/auth/login", "/api/shopOrder/create", } func ApiMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 从Header或Query中获取token token := c.GetHeader("Authorization") if token == "" { token = c.Query("token") } // 定义member结构信息 var member *model.XMember var err error //获取redis redisServer := server.GetRedisServerInstance() // 检查当前路径是否在白名单中 if isPathInWhiteList(c.Request.URL.Path) { if len(token) > 0 { data := redisServer.GetStr(token) if len(data) == 0 { //没用缓存信息 //根据token获取用户信息 memberModel := model.XMember{} member, err = memberModel.GetMemberByToken(token) if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": "认证信息已过期", "data": nil, }) } if member.ID <= 0 { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": "token失效", "data": nil, }) } //存入缓存 jsonData, _ := json.Marshal(member) redisServer.SetStr(token, string(jsonData), 120) } else { _ = json.Unmarshal([]byte(data), &member) } c.Set("mId", member.ID) } c.Next() return } if token == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 404, "message": "缺少认证信息", "data": nil, }) return } data := redisServer.GetStr(token) if len(data) == 0 { //没用缓存信息 //根据token获取用户信息 memberModel := model.XMember{} member, err = memberModel.GetMemberByToken(token) if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": "认证信息已过期", "data": nil, }) } if member.ID <= 0 { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": "token失效", "data": nil, }) } //存入缓存 jsonData, _ := json.Marshal(member) redisServer.SetStr(token, string(jsonData), 120) } else { _ = json.Unmarshal([]byte(data), &member) } c.Set("mId", member.ID) c.Next() } } // isPathInWhiteList 检查路径是否在白名单中 func isPathInWhiteList(path string) bool { for _, whitePath := range whiteList { // 精确匹配(用于匹配路径前缀) if path == whitePath { return true } } return false }