in.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package login
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/demdxx/gocast"
  6. "github.com/gin-gonic/gin"
  7. "github.com/samber/lo"
  8. "go_server/base/core"
  9. "go_server/base/engine/middleware"
  10. "go_server/model/common/response"
  11. "go_server/model/system"
  12. "go_server/service/base"
  13. "time"
  14. )
  15. func (s *AppService) In(c *gin.Context) {
  16. type request struct {
  17. Username interface{} `json:"username" validate:"required"`
  18. Password interface{} `json:"password" validate:"required"`
  19. GoogleCode interface{} `json:"googleCode"` // 谷歌验证码
  20. Cid *string `json:"cid"` // 验证Id
  21. Code *string `json:"code"` // 验证码
  22. }
  23. var err error
  24. defer func() {
  25. if err != nil {
  26. _ = core.CapEngine().CapAdd(s.Redis(), c.RemoteIP())
  27. } else {
  28. _ = core.CapEngine().CapClear(s.Redis(), c.RemoteIP())
  29. _ = core.NewRateLimiter(s.Redis()).ClearLimit(context.Background(), "LOGIN", c.RemoteIP())
  30. }
  31. }()
  32. // 接口请求频率限制
  33. allowed, err := core.NewRateLimiter(s.Redis()).CanExecuteMethod(context.Background(), "LOGIN", c.RemoteIP())
  34. if err != nil {
  35. response.Resp(c, "请求频繁")
  36. return
  37. }
  38. if !allowed {
  39. response.Resp(c, "请求频繁")
  40. return
  41. }
  42. req := new(request)
  43. if err = c.BindJSON(req); err != nil {
  44. response.Resp(c, err.Error())
  45. return
  46. }
  47. // Check
  48. username := gocast.ToString(req.Username)
  49. password := gocast.ToString(req.Password)
  50. googleCode := gocast.ToString(req.GoogleCode)
  51. if username == "" || password == "" {
  52. response.Resp(c, response.ResponseCodeParamError)
  53. return
  54. }
  55. // 请求频率限制
  56. //serviceName := "AdminLogin" + c.RemoteIP()
  57. //checkRep := s.RepeatFilter(serviceName, time.Duration(2)*time.Second)
  58. //if !checkRep {
  59. // response.Resp(c, response.ResponseCodeFrequentOperation)
  60. // return
  61. //}
  62. t, ok := core.CapEngine().CapCheck(s.Redis(), c.RemoteIP())
  63. if ok {
  64. if req.Cid == nil || req.Code == nil {
  65. err = fmt.Errorf("连续%d次输入错误信息 请输入验证码", t)
  66. response.Resp(c, err.Error())
  67. return
  68. }
  69. if !core.CapEngine().Verify(*req.Cid, *req.Code) {
  70. err = fmt.Errorf("连续%d次输入错误信息 请注意区分大小写", t)
  71. response.Resp(c, err.Error())
  72. return
  73. }
  74. }
  75. user, ok := base.GetOne[system.Administrator](s.DB(), "username", username)
  76. if !ok {
  77. err = fmt.Errorf("连续%d次输入错误信息", t)
  78. response.Resp(c, err.Error())
  79. return
  80. }
  81. if user.Lock {
  82. err = fmt.Errorf("连续%d次输入错误信息", t)
  83. response.Resp(c, err.Error())
  84. return
  85. }
  86. if !user.CheckPassWord(password) {
  87. err = fmt.Errorf("连续%d次输入错误信息", t)
  88. response.Resp(c, err.Error())
  89. return
  90. }
  91. if user.GoogleKey != "" {
  92. if googleCode == "" {
  93. err = fmt.Errorf("连续%d次输入错误信息:GoogleCodeError", t)
  94. response.Resp(c, err.Error())
  95. return
  96. }
  97. if ok, _ := core.NewGoogleAuth().VerifyCode(user.GoogleKey, googleCode); !ok {
  98. err = fmt.Errorf("连续%d次输入错误信息:GoogleCodeError", t)
  99. response.Resp(c, err.Error())
  100. return
  101. }
  102. }
  103. tokenString, err := middleware.GenerateJWT(middleware.Member{
  104. ID: user.ID,
  105. RoleId: user.RoleId,
  106. })
  107. if err != nil {
  108. response.Resp(c, err.Error())
  109. return
  110. }
  111. // 保存token到mysql
  112. user.LastLoginIp = c.RemoteIP()
  113. user.LastLoginTime = lo.ToPtr(time.Now())
  114. user.Token = tokenString
  115. if err = s.DB().Save(&user).Error; err != nil {
  116. response.Resp(c, err.Error())
  117. return
  118. }
  119. data := make(map[string]interface{})
  120. data["nickname"] = user.Nickname
  121. data["avatar"] = user.Avatar
  122. data["token"] = tokenString
  123. response.Resp(c, data)
  124. return
  125. }