user_login.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_crm_ht/models"
  5. "eta/eta_mini_crm_ht/models/request"
  6. "eta/eta_mini_crm_ht/models/response"
  7. "eta/eta_mini_crm_ht/services"
  8. "eta/eta_mini_crm_ht/utils"
  9. "fmt"
  10. "time"
  11. )
  12. type UserLoginController struct {
  13. BaseCommonController
  14. }
  15. func ssoLogin(req request.UserLoginReq, br *models.BaseResponse) {
  16. if req.Code == "" {
  17. br.Msg = "code不能为空"
  18. return
  19. }
  20. ssoResp, err := services.SSOLogin(req.Code)
  21. if err != nil {
  22. br.Msg = "登录失败"
  23. br.ErrMsg = "sso登录失败, Err:" + err.Error()
  24. return
  25. }
  26. utils.FileLog.Info(fmt.Sprintf("sso 登录请求结果:%s", ssoResp))
  27. sysUser, err := models.GetSysUserBySysUserName(ssoResp.UserName)
  28. if err != nil || sysUser.SysUserName == "" {
  29. br.ErrMsg = err.Error()
  30. br.Msg = "sso登录失败,获取用户信息失败"
  31. return
  32. }
  33. sysRole, err := models.GetSysRoleById(sysUser.SysRoleId)
  34. if err != nil {
  35. br.Msg = "登录失败"
  36. br.ErrMsg = "查询角色失败, Err:" + err.Error()
  37. return
  38. }
  39. account := utils.MD5(sysUser.SysUserName)
  40. token := utils.GenToken(account)
  41. sysSession := new(models.SysSession)
  42. sysSession.UserName = sysUser.SysUserName
  43. sysSession.SysUserId = sysUser.SysUserId
  44. sysSession.ExpiredTime = time.Now().AddDate(0, 0, 60)
  45. sysSession.CreatedTime = time.Now()
  46. sysSession.LastUpdatedTime = time.Now()
  47. sysSession.AccessToken = token
  48. err = sysSession.AddSysSession()
  49. if err != nil {
  50. br.Msg = "登录失败"
  51. br.ErrMsg = "新增session信息失败, Err:" + err.Error()
  52. return
  53. }
  54. resp := new(response.LoginResp)
  55. resp.Authorization = "authorization=" + token
  56. resp.SysUserName = sysUser.SysUserName
  57. resp.SysRealName = sysUser.SysRealName
  58. resp.SysUserId = sysUser.SysUserId
  59. resp.RoleName = sysRole.SysRoleName
  60. resp.RoleId = sysUser.SysRoleId
  61. //获取不可信的登录态,并将该登录态重置掉,不允许多次登录
  62. noTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST, sysUser.SysUserId)
  63. noTrustLoginId, _ := utils.Rc.RedisString(noTrustLoginKey)
  64. fmt.Println("noTrustLoginId:", noTrustLoginId)
  65. if noTrustLoginId != `` { // 如果存在不可信设备,那么将其下架
  66. oldNoTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, noTrustLoginId)
  67. utils.Rc.Put(oldNoTrustLoginKey, "0", time.Hour*24)
  68. }
  69. // 设置redis缓存,记录用户登录态
  70. loginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, sysSession.SysSessionId)
  71. utils.Rc.Put(loginKey, "1", time.Hour*24)
  72. utils.Rc.Put(noTrustLoginKey, sysSession.SysSessionId, time.Hour*24*60)
  73. br.Data = resp
  74. br.Ret = 200
  75. br.Success = true
  76. br.Msg = "登录成功"
  77. }
  78. // Login
  79. // @Title 用户登录
  80. // @Description 用户登录
  81. // @Param request body UserLoginReq true "type json string"
  82. // @Success 200 {object} models.LoginResp
  83. // @router /login [post]
  84. func (this *UserLoginController) Login() {
  85. br := new(models.BaseResponse).Init()
  86. defer func() {
  87. this.Data["json"] = br
  88. this.ServeJSON()
  89. }()
  90. var req request.UserLoginReq
  91. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  92. if err != nil {
  93. br.Msg = "参数错误"
  94. br.ErrMsg = "解析参数失败:" + err.Error()
  95. return
  96. }
  97. switch req.LoginType {
  98. case "sso":
  99. ssoLogin(req, br)
  100. case "password":
  101. login(req, br)
  102. default:
  103. ssoLogin(req, br)
  104. }
  105. }
  106. func login(req request.UserLoginReq, br *models.BaseResponse) {
  107. if req.UserName == "" {
  108. br.Msg = "请输入账号"
  109. return
  110. }
  111. if req.Password == "" {
  112. br.Msg = "请输入密码"
  113. return
  114. }
  115. sysUser, err := models.GetSysUserBySysUserName(req.UserName)
  116. if err != nil {
  117. if err.Error() == utils.ErrNoRow() {
  118. br.Msg = "登录失败, 账号或密码错误"
  119. return
  120. } else {
  121. br.Msg = "系统错误"
  122. br.ErrMsg = "系统错误" + err.Error()
  123. return
  124. }
  125. }
  126. sysRole, err := models.GetSysRoleById(sysUser.SysRoleId)
  127. if err != nil {
  128. br.Msg = "登录失败"
  129. br.ErrMsg = "查询角色失败, Err:" + err.Error()
  130. return
  131. }
  132. dbPass := utils.MD5(fmt.Sprintf("%s%s%s", sysUser.Password, utils.UserLoginSalt, req.ReqTime))
  133. if req.Password != dbPass {
  134. br.Msg = "登录失败, 账号或密码错误"
  135. return
  136. }
  137. account := utils.MD5(sysUser.SysUserName)
  138. token := utils.GenToken(account)
  139. sysSession := new(models.SysSession)
  140. sysSession.UserName = sysUser.SysUserName
  141. sysSession.SysUserId = sysUser.SysUserId
  142. sysSession.ExpiredTime = time.Now().AddDate(0, 0, 60)
  143. sysSession.CreatedTime = time.Now()
  144. sysSession.LastUpdatedTime = time.Now()
  145. sysSession.AccessToken = token
  146. err = sysSession.AddSysSession()
  147. if err != nil {
  148. br.Msg = "登录失败"
  149. br.ErrMsg = "新增session信息失败, Err:" + err.Error()
  150. return
  151. }
  152. resp := new(response.LoginResp)
  153. resp.Authorization = "authorization=" + token
  154. resp.SysUserName = sysUser.SysUserName
  155. resp.SysRealName = sysUser.SysRealName
  156. resp.SysUserId = sysUser.SysUserId
  157. resp.RoleName = sysRole.SysRoleName
  158. resp.RoleId = sysUser.SysRoleId
  159. // 获取不可信的登录态,并将该登录态重置掉,不允许多次登录
  160. noTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST, sysUser.SysUserId)
  161. noTrustLoginId, _ := utils.Rc.RedisString(noTrustLoginKey)
  162. fmt.Println("noTrustLoginId:", noTrustLoginId)
  163. if noTrustLoginId != `` { // 如果存在不可信设备,那么将其下架
  164. oldNoTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, noTrustLoginId)
  165. utils.Rc.Put(oldNoTrustLoginKey, "0", time.Hour*24)
  166. }
  167. // 设置redis缓存,记录用户登录态
  168. loginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, sysSession.SysSessionId)
  169. utils.Rc.Put(loginKey, "1", time.Hour*24)
  170. utils.Rc.Put(noTrustLoginKey, sysSession.SysSessionId, time.Hour*24*60)
  171. br.Data = resp
  172. br.Ret = 200
  173. br.Success = true
  174. br.Msg = "登录成功"
  175. }
  176. // AreaCodeList
  177. // @Title 手机号区号列表
  178. // @Description 手机号区号列表
  179. // @Success 200 Ret=200 获取成功
  180. // @router /area_code/list [get]
  181. func (this *UserLoginController) AreaCodeList() {
  182. br := new(models.BaseResponse).Init()
  183. defer func() {
  184. if br.ErrMsg == "" {
  185. br.IsSendEmail = false
  186. }
  187. this.Data["json"] = br
  188. this.ServeJSON()
  189. }()
  190. resp := make([]response.AreaCodeListResp, 0)
  191. confAuth, e := models.GetConfigDetailByCode(models.ConfAreaCodeListKey)
  192. if e != nil {
  193. br.Msg = "获取失败"
  194. br.ErrMsg = "获取手机号区号配置失败, Err: " + e.Error()
  195. return
  196. }
  197. if confAuth.ConfigValue == "" {
  198. br.Msg = "获取失败"
  199. br.ErrMsg = "手机号区号配置为空"
  200. return
  201. }
  202. if e := json.Unmarshal([]byte(confAuth.ConfigValue), &resp); e != nil {
  203. br.Msg = "获取失败"
  204. br.ErrMsg = "手机号区号配置有误"
  205. return
  206. }
  207. br.Data = resp
  208. br.Ret = 200
  209. br.Success = true
  210. br.Msg = "获取成功"
  211. }