api.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. // 检查当前路径是否在白名单中
  17. if isPathInWhiteList(c.Request.URL.Path) {
  18. c.Next()
  19. return
  20. }
  21. // 从Header或Query中获取token
  22. token := c.GetHeader("Authorization")
  23. if token == "" {
  24. token = c.Query("token")
  25. }
  26. if token == "" {
  27. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  28. "code": 404,
  29. "message": "缺少认证信息",
  30. "data": nil,
  31. })
  32. return
  33. }
  34. // 1. 尝试从Redis缓存获取用户信息
  35. var member *model.XMember
  36. var err error
  37. redisServer := server.GetRedisServerInstance()
  38. data := redisServer.GetStr(token)
  39. if len(data) == 0 { //没用缓存信息
  40. //根据token获取用户信息
  41. memberModel := model.XMember{}
  42. member, err = memberModel.GetMemberByToken(token)
  43. if err != nil {
  44. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  45. "code": 401,
  46. "message": "认证信息已过期",
  47. "data": nil,
  48. })
  49. }
  50. if member.ID <= 0 {
  51. c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{
  52. "code": 401,
  53. "message": "token失效",
  54. "data": nil,
  55. })
  56. }
  57. //存入缓存
  58. jsonData, _ := json.Marshal(member)
  59. redisServer.SetStr(token, string(jsonData), 120)
  60. } else {
  61. _ = json.Unmarshal([]byte(data), &member)
  62. }
  63. c.Set("mId", member.ID)
  64. c.Next()
  65. }
  66. }
  67. // isPathInWhiteList 检查路径是否在白名单中
  68. func isPathInWhiteList(path string) bool {
  69. for _, whitePath := range whiteList {
  70. // 精确匹配(用于匹配路径前缀)
  71. if path == whitePath {
  72. return true
  73. }
  74. }
  75. return false
  76. }