light_auth.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package auth
  2. import (
  3. "fmt"
  4. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  5. sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  6. sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  7. "github.com/xormplus/xorm"
  8. "net"
  9. "net/http"
  10. "strings"
  11. )
  12. type LightAuth struct {
  13. }
  14. var session *xorm.Engine
  15. func init() {
  16. lightAuth := &LightAuth{}
  17. RegisterAuth("qianqiusoft.com", lightAuth)
  18. }
  19. func (la *LightAuth) Init() {
  20. }
  21. func (la *LightAuth) Login(c *entitys.CtrlContext) {
  22. var logininfo sysmodel.LoginInfo
  23. c.Ctx.BindJSON(&logininfo)
  24. //fmt.Println(logininfo)
  25. var user sysmodel.SysUser
  26. ret, err := c.PlatformDbEngine.SQL(sysmodel.SqlUserLogin, logininfo.Account).Get(&user)
  27. if ret && err == nil {
  28. // 输错密码5次,锁定账户10分钟不允许登录
  29. if !sysutils.GetGlobalLoginCheck().CheckErrNum(user.LoginId) {
  30. c.Ctx.JSON(200, sysmodel.SysReturn{400, "输错密码5次,锁定账户10分钟!", nil})
  31. return
  32. }
  33. md5Pwd := sysutils.HashPassword(logininfo.Password, "")
  34. //密码错误
  35. if !strings.EqualFold(user.Password, md5Pwd) {
  36. if !sysutils.GetGlobalLoginCheck().AddPwdErrNum(user.LoginId) {
  37. c.Ctx.JSON(200, sysmodel.SysReturn{400, "输错密码5次,锁定账户10分钟!", nil})
  38. return
  39. }
  40. c.Ctx.JSON(200, sysmodel.SysReturn{400, "password incorrect!", nil})
  41. return
  42. }
  43. //token := &entitys.Token{}
  44. //timestamp_str := strconv.FormatUint(timestamp, 10)
  45. //sec_tooken := sysutils.GenerateToken(logininfo.Account + timestamp_str)
  46. //if v := sysutils.GetGlobalTokenStore().Get(sec_tooken); v == nil {
  47. // token.AccessToken = sec_tooken
  48. // token.RefreshToken = sec_tooken
  49. // token.LoginID = logininfo.Account
  50. // token.UserId = user.Id
  51. // token.Result = 200
  52. // //token.Password = pwd
  53. // token.ServerIp = ""
  54. // token.Domain = user.Domain
  55. // sysutils.GetGlobalTokenStore().Set(sec_tooken, token)
  56. // //sysutils.GetGlobalTokenStore().Set(token.LoginID+user.Domain, token)
  57. //} else {
  58. // token = v
  59. //}
  60. //// 查找Business对应的用户信息
  61. //var businessUser sysmodel.SysUser
  62. //_, err = c.App.GetBusinessDb(user.Domain).Table(new(sysmodel.SysUser)).ID(user.Id).Get(&businessUser)
  63. //if err != nil {
  64. // c.Ctx.JSON(200, sysmodel.SysReturn{400, "business db con't found user!", nil})
  65. // return
  66. //}
  67. //
  68. //data := sysmodel.LoginReturnInfo{}
  69. //data.Id = user.Id
  70. //data.LoginId = user.LoginId
  71. //data.Token = token.AccessToken
  72. //data.Type = user.Type
  73. //data.Domain = user.Domain
  74. //data.OrgId = businessUser.OrgId
  75. //data.Name = businessUser.Name
  76. //data.Mobile = businessUser.Mobile
  77. //data.Email = businessUser.Email
  78. //
  79. //// 查找用户对应角色
  80. //var roles []sysmodel.SysRole
  81. //c.App.GetBusinessDb(user.Domain).SQL("select sys_role.* from sys_user_role, sys_role where sys_user_role.role_id = sys_role.id and sys_role.del_flag = 0 and sys_user_role.user_id = ? order by sys_role.priority asc", user.Id).Find(&roles)
  82. //data.Roles = roles
  83. data, err := AddToGlobalTokenStore(c, &user)
  84. if err != nil {
  85. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  86. return
  87. }
  88. //登录日志
  89. if session != nil {
  90. ip := RemoteIp(c.Ctx.Request)
  91. sql := "insert into log_sys_login (user_id,account,ip_addr,login_time,del_flag,login_type,user_name) values (?, ?,?,?,?,?,?)"
  92. _, err = session.Exec(sql, user.Id, user.LoginId, ip, sysmodel.NowLocal().Value(), 0, 0, user.Name)
  93. if err != nil {
  94. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  95. return
  96. }
  97. }
  98. //
  99. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", data})
  100. } else {
  101. //fmt.Println(err.Error())
  102. c.Ctx.JSON(200, sysmodel.SysReturn{400, "username or password incorrect!", nil})
  103. }
  104. }
  105. func (la *LightAuth) Logout(c *entitys.CtrlContext) {
  106. token := c.Ctx.GetHeader("token")
  107. fmt.Println("delete token: ", token)
  108. sysutils.GetGlobalTokenStore().Remove(token)
  109. //登录日志
  110. tokenStore := sysutils.GetGlobalTokenStore()
  111. tokenInfo := tokenStore.Get(token)
  112. user := new(sysmodel.SysUser)
  113. if session != nil && tokenInfo != nil {
  114. _, err := c.PlatformDbEngine.Table(user.TableName()).Where("login_id = ?", tokenInfo.LoginID).Get(user)
  115. if err != nil {
  116. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  117. return
  118. }
  119. ip := RemoteIp(c.Ctx.Request)
  120. sql := "insert into log_sys_login (user_id,account,ip_addr,login_time,del_flag,login_type,user_name) values (?, ?,?,?,?,?,?)"
  121. _, err = session.Exec(sql, user.Id, user.LoginId, ip, sysmodel.NowLocal().Value(), 0, 1, user.Name)
  122. if err != nil {
  123. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  124. return
  125. }
  126. }
  127. //
  128. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
  129. }
  130. const (
  131. XForwardedFor = "X-Forwarded-For"
  132. XRealIP = "X-Real-IP"
  133. )
  134. // RemoteIp 返回远程客户端的 IP,如 192.168.1.1
  135. func RemoteIp(req *http.Request) string {
  136. remoteAddr := req.RemoteAddr
  137. if ip := req.Header.Get(XRealIP); ip != "" {
  138. remoteAddr = ip
  139. } else if ip = req.Header.Get(XForwardedFor); ip != "" {
  140. remoteAddr = ip
  141. } else {
  142. remoteAddr, _, _ = net.SplitHostPort(remoteAddr)
  143. }
  144. if remoteAddr == "::1" {
  145. remoteAddr = "127.0.0.1"
  146. }
  147. return remoteAddr
  148. }