token.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package middleware
  2. import (
  3. "encoding/base64"
  4. "gadmin/config"
  5. "gadmin/utility/serializer"
  6. "gadmin/utility/token"
  7. "github.com/gin-gonic/gin"
  8. jsoniter "github.com/json-iterator/go"
  9. "github.com/sirupsen/logrus"
  10. "strconv"
  11. "time"
  12. )
  13. // 路由白名单
  14. var whitelist = []string{
  15. "/api/gm/userRoles",
  16. }
  17. // Token 验证token
  18. func Token() gin.HandlerFunc {
  19. return func(c *gin.Context) {
  20. if isWhite(c.Request.URL.Path) {
  21. c.Next()
  22. return
  23. }
  24. encodeToken := token.GetAuthorization(c)
  25. if encodeToken == "" {
  26. c.JSON(200, serializer.CheckLogin())
  27. c.Abort()
  28. return
  29. }
  30. bytesT, err := base64.URLEncoding.DecodeString(encodeToken)
  31. if err != nil {
  32. logrus.Warningf("middleware base64.URLEncoding.DecodeString:%+v", err.Error())
  33. c.JSON(200, serializer.CheckLogin())
  34. c.Abort()
  35. return
  36. }
  37. t := string(bytesT)
  38. tokenKey := config.GetTokenKey(t)
  39. if config.TokenRedis.Exists(tokenKey).Val() == 0 {
  40. c.JSON(200, serializer.CheckLogin())
  41. c.Abort()
  42. return
  43. }
  44. userStr := config.TokenRedis.Get(tokenKey).Val()
  45. user := new(token.UserClaims)
  46. if err := jsoniter.UnmarshalFromString(userStr, user); err != nil {
  47. c.JSON(200, serializer.CheckLogin())
  48. c.Abort()
  49. return
  50. }
  51. if user.ID == 0 {
  52. c.JSON(200, serializer.CheckLogin())
  53. c.Abort()
  54. return
  55. }
  56. // 查询登录token是否有效
  57. key := config.GetUserTokenKey(user.ID)
  58. tokenCTStr := config.TokenRedis.HGet(key, t).Val()
  59. tokenCreateTime, err := strconv.Atoi(tokenCTStr)
  60. if err != nil {
  61. logrus.Warningf("middleware config.LogRedis.HGet:%+v", err.Error())
  62. c.JSON(200, serializer.CheckLogin())
  63. c.Abort()
  64. return
  65. }
  66. tokenCT := time.Unix(int64(tokenCreateTime), 0)
  67. if tokenCT.Before(time.Now().Add(-config.TokenExpireTime)) {
  68. c.JSON(200, serializer.CheckLogin())
  69. c.Abort()
  70. return
  71. }
  72. config.TokenRedis.HSet(key, t, time.Now().Unix())
  73. config.TokenRedis.Expire(key, config.TokenExpireTime)
  74. config.TokenRedis.Expire(tokenKey, config.TokenExpireTime)
  75. //if os.Getenv("GIN_MODE") == "release" && claims.UserName == "mojun" {
  76. // c.JSON(200, serializer.CheckLogin())
  77. // c.Abort()
  78. // return
  79. //}
  80. c.Set("user", user)
  81. c.Set("admin_role_id", user.RoleId)
  82. c.Next()
  83. return
  84. }
  85. }
  86. func isWhite(path string) bool {
  87. for _, v := range whitelist {
  88. if path == v {
  89. return true
  90. }
  91. }
  92. return false
  93. }