middleware.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package router
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. "github.com/gin-gonic/gin"
  7. "github.com/go-redis/redis/v8"
  8. mhayaTime "github.com/mhaya/extend/time"
  9. cfacade "github.com/mhaya/facade"
  10. "github.com/mhaya/game/game_cluster/internal/code"
  11. "github.com/mhaya/game/game_cluster/internal/constant"
  12. "github.com/mhaya/game/game_cluster/internal/mdb"
  13. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  14. "github.com/mhaya/game/game_cluster/nodes/webadmin/common"
  15. "github.com/mhaya/game/game_cluster/nodes/webadmin/model"
  16. "github.com/mhaya/game/game_cluster/nodes/webadmin/service"
  17. mhayaLogger "github.com/mhaya/logger"
  18. "go.mongodb.org/mongo-driver/bson"
  19. "go.mongodb.org/mongo-driver/mongo"
  20. )
  21. func Auth(settingObj cfacade.ProfileJSON) gin.HandlerFunc {
  22. return func(c *gin.Context) {
  23. // 请求开始时间
  24. startTime := mhayaTime.Now().UnixMilli()
  25. tokenString := c.GetHeader("Token")
  26. if tokenString == "" {
  27. common.PackUnauthorizedResult(c, code.UnauthorizedError, "token is empty")
  28. return
  29. }
  30. roleId, err := mdb.RDB.Get(context.Background(), tokenString).Result()
  31. if err != nil && err != redis.Nil {
  32. mhayaLogger.Warnf("Auth Get error: %s", err.Error())
  33. common.PackUnauthorizedResult(c, code.InternalError, "token is empty")
  34. return
  35. }
  36. if roleId == "" {
  37. common.PackUnauthorizedResult(c, code.UnauthorizedError, "token is invalid")
  38. return
  39. }
  40. if roleId != constant.AdminAccess {
  41. urlAccess, err := mdb.RDB.HGet(context.Background(), common.GetTokenKey(tokenString), c.Request.URL.Path).Result()
  42. if err != nil {
  43. mhayaLogger.Warnf("Auth HGet s error: %s", err.Error())
  44. common.PackUnauthorizedResult(c, code.InternalError, "")
  45. return
  46. }
  47. // 检查url权限
  48. if urlAccess == "" {
  49. common.PackUnauthorizedResult(c, code.UnauthorizedError, "token is no auth")
  50. return
  51. }
  52. // 非管理员需要进行ip校验
  53. openIpWhitelist := settingObj.Get("open_ip_whitelist").ToBool()
  54. if openIpWhitelist {
  55. err = checkIPWhitelist(c)
  56. if err != nil {
  57. mhayaLogger.Warnf("Auth checkIPWhitelist error: %s", err.Error())
  58. common.PackForbiddenResult(c, code.ForbiddenError, "ip is no auth")
  59. return
  60. }
  61. }
  62. }
  63. adminAccess, err := mdb.RDB.HGet(context.Background(), common.GetTokenKey(tokenString), constant.AdminAccess).Result()
  64. if err != nil {
  65. mhayaLogger.Warnf("Auth HGet ss error: %s", err.Error())
  66. common.PackUnauthorizedResult(c, code.InternalError, "")
  67. return
  68. }
  69. // 检查管理员权限
  70. if adminAccess == "" {
  71. common.PackUnauthorizedResult(c, code.UnauthorizedError, "token is no auth")
  72. return
  73. }
  74. c.Next()
  75. userName, err := mdb.RDB.Get(context.Background(), common.GetUserNameKey(tokenString)).Result()
  76. if err == nil {
  77. service.NewSynthesis().InsertRecord(model.UserOperationLog{
  78. Username: userName,
  79. RoleId: roleId,
  80. Path: c.Request.URL.Path,
  81. Method: c.Request.Method,
  82. StatusCode: c.Writer.Status(),
  83. Dur: mhayaTime.Now().UnixMilli() - startTime,
  84. ClientIP: c.ClientIP(),
  85. ErrorMessage: c.Errors.ByType(gin.ErrorTypePrivate).String(),
  86. })
  87. }
  88. }
  89. }
  90. // checkIP
  91. func checkIPWhitelist(c *gin.Context) error {
  92. // 获取请求的ip
  93. ip := c.ClientIP()
  94. var whitelistModel *models.Whitelist
  95. collection := mdb.MDB.Collection(whitelistModel.TableName())
  96. // 设置超时时间
  97. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  98. defer cancel() // 确保在函数退出时取消上下文
  99. // 示例:查询 IP 是否在白名单中
  100. err := collection.FindOne(ctx, bson.M{"ip": ip}).Decode(&whitelistModel)
  101. if err != nil && err != mongo.ErrNoDocuments {
  102. return err
  103. }
  104. // 根据查询结果决定是否允许访问
  105. if whitelistModel == nil {
  106. return errors.New("IP not in whitelist") // 拒绝访问
  107. }
  108. return nil // 允许访问
  109. }