adminLoginLogic.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package pub
  2. import (
  3. "context"
  4. "crypto/subtle"
  5. "errors"
  6. "time"
  7. "perms-system-server/internal/consts"
  8. authHelper "perms-system-server/internal/logic/auth"
  9. "perms-system-server/internal/model/user"
  10. "perms-system-server/internal/response"
  11. "perms-system-server/internal/svc"
  12. "perms-system-server/internal/types"
  13. "github.com/zeromicro/go-zero/core/limit"
  14. "github.com/zeromicro/go-zero/core/logx"
  15. "golang.org/x/crypto/bcrypt"
  16. )
  17. type AdminLoginLogic struct {
  18. logx.Logger
  19. ctx context.Context
  20. svcCtx *svc.ServiceContext
  21. }
  22. func NewAdminLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminLoginLogic {
  23. return &AdminLoginLogic{
  24. Logger: logx.WithContext(ctx),
  25. ctx: ctx,
  26. svcCtx: svcCtx,
  27. }
  28. }
  29. func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.LoginResp, err error) {
  30. if subtle.ConstantTimeCompare([]byte(req.ManagementKey), []byte(l.svcCtx.Config.Auth.ManagementKey)) != 1 {
  31. return nil, response.ErrUnauthorized("managementKey无效")
  32. }
  33. if l.svcCtx.UsernameLoginLimit != nil {
  34. code, _ := l.svcCtx.UsernameLoginLimit.Take(req.Username)
  35. if code == limit.OverQuota {
  36. return nil, response.NewCodeError(429, "该账号登录尝试过于频繁,请5分钟后再试")
  37. }
  38. }
  39. u, err := l.svcCtx.SysUserModel.FindOneByUsername(l.ctx, req.Username)
  40. if err != nil {
  41. if errors.Is(err, user.ErrNotFound) {
  42. return nil, response.ErrUnauthorized("用户名或密码错误")
  43. }
  44. return nil, err
  45. }
  46. if u.Status != consts.StatusEnabled {
  47. return nil, response.ErrForbidden("账号已被冻结")
  48. }
  49. if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(req.Password)); err != nil {
  50. return nil, response.ErrUnauthorized("用户名或密码错误")
  51. }
  52. if u.IsSuperAdmin != consts.IsSuperAdminYes {
  53. return nil, response.ErrForbidden("仅超级管理员可通过管理后台登录")
  54. }
  55. ud := l.svcCtx.UserDetailsLoader.Load(l.ctx, u.Id, "")
  56. accessToken, err := authHelper.GenerateAccessToken(
  57. l.svcCtx.Config.Auth.AccessSecret,
  58. l.svcCtx.Config.Auth.AccessExpire,
  59. ud.UserId, ud.Username, ud.ProductCode, ud.MemberType, ud.TokenVersion,
  60. )
  61. if err != nil {
  62. return nil, err
  63. }
  64. refreshToken, err := authHelper.GenerateRefreshToken(
  65. l.svcCtx.Config.Auth.RefreshSecret,
  66. l.svcCtx.Config.Auth.RefreshExpire,
  67. ud.UserId, ud.ProductCode, ud.TokenVersion,
  68. )
  69. if err != nil {
  70. return nil, err
  71. }
  72. return &types.LoginResp{
  73. AccessToken: accessToken,
  74. RefreshToken: refreshToken,
  75. Expires: time.Now().Unix() + l.svcCtx.Config.Auth.AccessExpire,
  76. UserInfo: types.UserInfo{
  77. UserId: ud.UserId,
  78. Username: ud.Username,
  79. Nickname: ud.Nickname,
  80. Avatar: ud.Avatar,
  81. Email: ud.Email,
  82. Phone: ud.Phone,
  83. IsSuperAdmin: ud.IsSuperAdminRaw,
  84. MustChangePassword: ud.MustChangePwdRaw,
  85. MemberType: ud.MemberType,
  86. Perms: ud.Perms,
  87. },
  88. }, nil
  89. }