auth.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package handlers
  2. import (
  3. "net/http"
  4. "time"
  5. "easydo-echo_win7/models"
  6. "easydo-echo_win7/services"
  7. "easydo-echo_win7/utils"
  8. "github.com/labstack/echo-contrib/session"
  9. "github.com/labstack/echo/v4"
  10. )
  11. func Add_auth_to_routes(e *echo.Echo) {
  12. // 公共API路由(不需要认证)
  13. authGroup := e.Group("/auth")
  14. authGroup.GET("/health", healthCheck)
  15. authGroup.GET("/code", generateCaptcha)
  16. authGroup.POST("/login", login)
  17. authGroup.POST("/logout", logout)
  18. }
  19. // HealthCheck 健康检查
  20. func healthCheck(c echo.Context) error {
  21. return c.JSON(http.StatusOK, utils.SuccessResponse("服务运行正常"))
  22. }
  23. // Login 用户登录
  24. func login(c echo.Context) error {
  25. req := new(models.UserLoginRequest)
  26. // 验证请求参数
  27. if err := c.Bind(req); err != nil {
  28. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("请求参数错误", err.Error()))
  29. }
  30. username := req.Username
  31. password := req.Password
  32. captchaID := req.CaptchaID
  33. captchaCode := req.CaptchaCode
  34. // 验证必填字段
  35. if username == "" || password == "" || captchaID == "" || captchaCode == "" {
  36. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("请填写完整信息", ""))
  37. }
  38. // 检查登录尝试
  39. if ok, msg := services.CheckLoginAttempts(username); !ok {
  40. return c.JSON(http.StatusBadRequest, utils.ErrorResponse(msg, ""))
  41. }
  42. // 验证验证码
  43. if !services.VerifyCaptcha(captchaID, captchaCode) {
  44. services.RecordLoginAttempt(username, false)
  45. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("验证码错误或已失效", ""))
  46. }
  47. // 验证用户凭据
  48. user := new(models.SysUser)
  49. user.Username = &username
  50. err := services.JdbcClient.GetJdbcModel(user)
  51. if err != nil || *user.ID == 0 || user.TenantId == nil {
  52. services.RecordLoginAttempt(username, false)
  53. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("用户不存在", ""))
  54. }
  55. tenant := new(models.Tenant)
  56. tenant.ID = user.TenantId
  57. err = services.JdbcClient.GetJdbcModelById(tenant)
  58. if err != nil {
  59. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("企业不存在", ""))
  60. }
  61. if tenant.Status == nil || *tenant.Status != models.Status_Enable {
  62. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("企业已被禁用", ""))
  63. }
  64. user.Tenant = tenant
  65. // 验证密码
  66. if !user.CheckPassword(password) {
  67. services.RecordLoginAttempt(username, false)
  68. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("用户名或密码错误", ""))
  69. }
  70. // 创建会话
  71. sess, _ := session.Get("auth_session", c)
  72. sess.Values["user_id"] = user.ID
  73. sess.Values["username"] = user.Username
  74. sess.Values["is_authenticated"] = true
  75. sess.Values["login_time"] = time.Now().Unix()
  76. if err := sess.Save(c.Request(), c.Response()); err != nil {
  77. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("会话创建失败", err.Error()))
  78. }
  79. dept := new(models.SysDept)
  80. dept.ID = user.DeptId
  81. err = services.JdbcClient.GetJdbcModelById(dept)
  82. if err != nil {
  83. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("用户所属部门不存在", ""))
  84. }
  85. user.Dept = dept
  86. paramMap := map[string]interface{}{
  87. "userId": user.ID,
  88. }
  89. p_result,_ := services.JdbcClient.GetJdbcList(paramMap,models.SysUsersRoles{})
  90. p_list := utils.ConvertInterface[[]models.SysUsersRoles](p_result)
  91. role_id_list :=utils.Map(p_list, func(user_role models.SysUsersRoles) int64 {
  92. return *user_role.RoleID
  93. })
  94. for k := range paramMap {
  95. delete(paramMap, k)
  96. }
  97. paramMap["idIn"] = role_id_list
  98. r_result,_ := services.JdbcClient.GetJdbcList(paramMap,models.SysRole{})
  99. role_list := utils.ConvertInterface[[]models.SysRole](r_result)
  100. user.RoleList = &role_list
  101. // 记录成功登录
  102. services.RecordLoginAttempt(username, true)
  103. // 返回成功响应
  104. return c.JSON(http.StatusOK, map[string]interface{}{
  105. "token":"-",
  106. "user": user,
  107. "session_expires": time.Now().Add(7 * 24 * time.Hour).Unix(),
  108. })
  109. }
  110. // Logout 用户登出
  111. func logout(c echo.Context) error {
  112. sess, _ := session.Get("auth_session", c)
  113. // 清除会话
  114. sess.Options.MaxAge = -1
  115. sess.Values = make(map[interface{}]interface{})
  116. if err := sess.Save(c.Request(), c.Response()); err != nil {
  117. return c.JSON(http.StatusBadRequest, utils.ErrorResponse("登出失败", err.Error()))
  118. }
  119. return c.JSON(http.StatusOK, utils.SuccessResponse("登出成功"))
  120. }