base_auth.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_crm/models"
  5. "eta/eta_mini_crm/utils"
  6. "net/http"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/beego/beego/v2/client/orm"
  11. "github.com/beego/beego/v2/server/web"
  12. )
  13. type BaseAuthController struct {
  14. web.Controller
  15. SysUser *models.SysUser
  16. Session *models.SysSession
  17. }
  18. func (c *BaseAuthController) Prepare() {
  19. method := c.Ctx.Input.Method()
  20. // uri := c.Ctx.Input.URI()
  21. if method != "HEAD" {
  22. if method == "POST" || method == "GET" {
  23. authorization := c.Ctx.Input.Header("authorization")
  24. if authorization == "" {
  25. c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"})
  26. c.StopRun()
  27. return
  28. }
  29. tokenStr := authorization
  30. tokenArr := strings.Split(tokenStr, "=")
  31. token := tokenArr[1]
  32. session, err := models.GetSysSessionByToken(token)
  33. if err != nil {
  34. if err == orm.ErrNoRows {
  35. c.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + token})
  36. c.StopRun()
  37. return
  38. }
  39. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()})
  40. c.StopRun()
  41. return
  42. }
  43. if session == nil {
  44. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sesson is empty "})
  45. c.StopRun()
  46. return
  47. }
  48. account := utils.MD5(session.UserName)
  49. if !utils.CheckToken(account, token) {
  50. c.JSON(models.BaseResponse{Ret: 408, Msg: "鉴权失败,请重新登录!", ErrMsg: "登录失效,请重新登陆!,CheckToken Fail"})
  51. c.StopRun()
  52. return
  53. }
  54. if time.Now().After(session.ExpiredTime) {
  55. c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新登录!", ErrMsg: "获取用户信息异常"})
  56. c.StopRun()
  57. return
  58. }
  59. sysUser, err := models.GetSysUserById(session.SysUserId)
  60. if err != nil {
  61. if err == orm.ErrNoRows {
  62. c.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取sysUser信息失败: " + strconv.Itoa(session.SysUserId)})
  63. c.StopRun()
  64. return
  65. }
  66. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取sysUser信息异常,Err:" + err.Error()})
  67. c.StopRun()
  68. return
  69. }
  70. if sysUser == nil {
  71. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sysUser is empty"})
  72. c.StopRun()
  73. return
  74. }
  75. if !sysUser.IsEnabled {
  76. c.JSON(models.BaseResponse{Ret: 408, Msg: "账户信息异常!", ErrMsg: "账户被禁用,不允许登陆!"})
  77. c.StopRun()
  78. return
  79. }
  80. c.SysUser = sysUser
  81. c.Session = session
  82. }
  83. }
  84. }
  85. func (c *BaseAuthController) JSON(data interface{}) error {
  86. c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
  87. desEncrypt := utils.DesBase64Encrypt([]byte(utils.DesKey), utils.DesKeySalt)
  88. c.Ctx.Output.Header("Dk", string(desEncrypt)) // des3加解密key
  89. // 设置Cookie为HTTPOnly
  90. c.Ctx.SetCookie("", "", -1, "/", "", false, true, "")
  91. content, err := json.Marshal(data)
  92. if err != nil {
  93. http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
  94. return err
  95. }
  96. if utils.RunMode != "debug" {
  97. content = utils.DesBase64Encrypt(content, utils.DesKey)
  98. content = []byte(`"` + string(content) + `"`)
  99. }
  100. return c.Ctx.Output.Body(content)
  101. }