adminLoginLogic.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package pub
  2. import (
  3. "context"
  4. "time"
  5. "perms-system-server/internal/middleware"
  6. "perms-system-server/internal/response"
  7. "perms-system-server/internal/svc"
  8. "perms-system-server/internal/types"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. )
  11. type AdminLoginLogic struct {
  12. logx.Logger
  13. ctx context.Context
  14. svcCtx *svc.ServiceContext
  15. }
  16. func NewAdminLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminLoginLogic {
  17. return &AdminLoginLogic{
  18. Logger: logx.WithContext(ctx),
  19. ctx: ctx,
  20. svcCtx: svcCtx,
  21. }
  22. }
  23. // AdminLogin 管理后台登录。仅限超级管理员通过 managementKey + 用户名密码登录管理后台,返回 JWT 令牌对。
  24. // 当 cap.js 未启用时,需同时携带 captchaId/captchaCode 进行图片验证码校验。
  25. func (l *AdminLoginLogic) AdminLogin(req *types.AdminLoginReq) (resp *types.LoginResp, err error) {
  26. // cap.js 启用时拒绝传统登录接口,必须走 /auth/adminLogin/cap
  27. cfg := l.svcCtx.Config.Capjs
  28. if cfg.Enable == 1 {
  29. return nil, response.ErrBadRequest("当前已启用人机验证,请使用人机验证登录")
  30. }
  31. if req.CaptchaId == "" || req.CaptchaCode == "" {
  32. return nil, response.ErrBadRequest("验证码不能为空")
  33. }
  34. if !VerifyCaptcha(req.CaptchaId, req.CaptchaCode) {
  35. return nil, response.ErrBadRequest("验证码错误或已过期")
  36. }
  37. clientIP := middleware.GetClientIP(l.ctx)
  38. result, err := ValidateAdminLogin(l.ctx, l.svcCtx, req.Username, req.Password, req.ManagementKey, clientIP)
  39. if err != nil {
  40. if le, ok := err.(*LoginError); ok {
  41. switch le.Code {
  42. case 401:
  43. return nil, response.ErrUnauthorized(le.Message)
  44. case 429:
  45. return nil, response.NewCodeError(429, le.Message)
  46. case 503:
  47. return nil, response.NewCodeError(503, le.Message)
  48. }
  49. }
  50. return nil, err
  51. }
  52. ud := result.UserDetails
  53. return &types.LoginResp{
  54. AccessToken: result.AccessToken,
  55. RefreshToken: result.RefreshToken,
  56. Expires: time.Now().Unix() + l.svcCtx.Config.Auth.AccessExpire,
  57. UserInfo: types.UserInfo{
  58. UserId: ud.UserId,
  59. Username: ud.Username,
  60. Nickname: ud.Nickname,
  61. Avatar: ud.Avatar,
  62. Email: ud.Email,
  63. Phone: ud.Phone,
  64. IsSuperAdmin: ud.IsSuperAdminRaw,
  65. MustChangePassword: ud.MustChangePwdRaw,
  66. MemberType: ud.MemberType,
  67. Perms: ud.Perms,
  68. },
  69. }, nil
  70. }