api.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package middleware
  2. import (
  3. "encoding/json"
  4. "github.com/gin-gonic/gin"
  5. "go_zh/model"
  6. "go_zh/server"
  7. "net/http"
  8. )
  9. // 不需要token验证的路由白名单
  10. var whiteList = []string{
  11. "/api/auth/login",
  12. "/api/shopOrder/create",
  13. }
  14. func ApiMiddleware() gin.HandlerFunc {
  15. return func(c *gin.Context) {
  16. // 从Header或Query中获取token
  17. token := c.GetHeader("Authorization")
  18. if token == "" {
  19. token = c.Query("token")
  20. }
  21. // 定义member结构信息
  22. var member *model.XMember
  23. var err error
  24. //获取redis
  25. redisServer := server.GetRedisServerInstance()
  26. // 检查当前路径是否在白名单中
  27. if isPathInWhiteList(c.Request.URL.Path) {
  28. if len(token) > 0 {
  29. data := redisServer.GetStr(token)
  30. if len(data) == 0 { //没用缓存信息
  31. //根据token获取用户信息
  32. memberModel := model.XMember{}
  33. member, err = memberModel.GetMemberByToken(token)
  34. if err != nil {
  35. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  36. "code": 401,
  37. "message": "认证信息已过期",
  38. "data": nil,
  39. })
  40. }
  41. if member.ID <= 0 {
  42. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  43. "code": 401,
  44. "message": "token失效",
  45. "data": nil,
  46. })
  47. }
  48. //存入缓存
  49. jsonData, _ := json.Marshal(member)
  50. redisServer.SetStr(token, string(jsonData), 120)
  51. } else {
  52. _ = json.Unmarshal([]byte(data), &member)
  53. }
  54. c.Set("mId", member.ID)
  55. }
  56. c.Next()
  57. return
  58. }
  59. if token == "" {
  60. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  61. "code": 404,
  62. "message": "缺少认证信息",
  63. "data": nil,
  64. })
  65. return
  66. }
  67. data := redisServer.GetStr(token)
  68. if len(data) == 0 { //没用缓存信息
  69. //根据token获取用户信息
  70. memberModel := model.XMember{}
  71. member, err = memberModel.GetMemberByToken(token)
  72. if err != nil {
  73. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  74. "code": 401,
  75. "message": "认证信息已过期",
  76. "data": nil,
  77. })
  78. }
  79. if member.ID <= 0 {
  80. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  81. "code": 401,
  82. "message": "token失效",
  83. "data": nil,
  84. })
  85. }
  86. //存入缓存
  87. jsonData, _ := json.Marshal(member)
  88. redisServer.SetStr(token, string(jsonData), 120)
  89. } else {
  90. _ = json.Unmarshal([]byte(data), &member)
  91. }
  92. c.Set("mId", member.ID)
  93. c.Next()
  94. }
  95. }
  96. // isPathInWhiteList 检查路径是否在白名单中
  97. func isPathInWhiteList(path string) bool {
  98. for _, whitePath := range whiteList {
  99. // 精确匹配(用于匹配路径前缀)
  100. if path == whitePath {
  101. return true
  102. }
  103. }
  104. return false
  105. }