api.go 1.8 KB

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