light_auth.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. package auth
  2. import (
  3. "fmt"
  4. "git.qianqiusoft.com/qianqiusoft/light-apiengine/config"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  6. sysmodel "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  7. sysutils "git.qianqiusoft.com/qianqiusoft/light-apiengine/utils"
  8. "github.com/xormplus/xorm"
  9. "net"
  10. "net/http"
  11. "strings"
  12. )
  13. type LightAuth struct {
  14. }
  15. var session, erpDb *xorm.Engine
  16. func init() {
  17. var err error
  18. lightAuth := &LightAuth{}
  19. RegisterAuth("qianqiusoft.com", lightAuth)
  20. if session == nil {
  21. session, err = xorm.NewEngine("mysql", config.AppConfig.GetKey("logger_data_source"))
  22. if err != nil {
  23. fmt.Println(err)
  24. return
  25. }
  26. }
  27. if erpDb == nil {
  28. erpDb, err = xorm.NewEngine("mysql", config.AppConfig.GetKey("erp_data_source"))
  29. if err != nil {
  30. fmt.Println(err)
  31. return
  32. }
  33. }
  34. }
  35. func (la *LightAuth) Init() {
  36. }
  37. func (la *LightAuth) Login(c *entitys.CtrlContext) {
  38. var logininfo sysmodel.LoginInfo
  39. c.Ctx.BindJSON(&logininfo)
  40. //fmt.Println(logininfo)
  41. var user sysmodel.SysUser
  42. ret, err := c.PlatformDbEngine.SQL(sysmodel.SqlUserLogin, logininfo.Account).Get(&user)
  43. if ret && err == nil {
  44. // 输错密码5次,锁定账户10分钟不允许登录
  45. if !sysutils.GetGlobalLoginCheck().CheckErrNum(user.LoginId) {
  46. c.Ctx.JSON(200, sysmodel.SysReturn{400, "输错密码5次,锁定账户10分钟!", nil})
  47. return
  48. }
  49. md5Pwd := sysutils.HashPassword(logininfo.Password, "")
  50. //密码错误
  51. if !strings.EqualFold(user.Password, md5Pwd) {
  52. if !sysutils.GetGlobalLoginCheck().AddPwdErrNum(user.LoginId) {
  53. c.Ctx.JSON(200, sysmodel.SysReturn{400, "输错密码5次,锁定账户10分钟!", nil})
  54. return
  55. }
  56. c.Ctx.JSON(200, sysmodel.SysReturn{400, "password incorrect!", nil})
  57. return
  58. }
  59. //token := &entitys.Token{}
  60. //timestamp_str := strconv.FormatUint(timestamp, 10)
  61. //sec_tooken := sysutils.GenerateToken(logininfo.Account + timestamp_str)
  62. //if v := sysutils.GetGlobalTokenStore().Get(sec_tooken); v == nil {
  63. // token.AccessToken = sec_tooken
  64. // token.RefreshToken = sec_tooken
  65. // token.LoginID = logininfo.Account
  66. // token.UserId = user.Id
  67. // token.Result = 200
  68. // //token.Password = pwd
  69. // token.ServerIp = ""
  70. // token.Domain = user.Domain
  71. // sysutils.GetGlobalTokenStore().Set(sec_tooken, token)
  72. // //sysutils.GetGlobalTokenStore().Set(token.LoginID+user.Domain, token)
  73. //} else {
  74. // token = v
  75. //}
  76. //// 查找Business对应的用户信息
  77. //var businessUser sysmodel.SysUser
  78. //_, err = c.App.GetBusinessDb(user.Domain).Table(new(sysmodel.SysUser)).ID(user.Id).Get(&businessUser)
  79. //if err != nil {
  80. // c.Ctx.JSON(200, sysmodel.SysReturn{400, "business db con't found user!", nil})
  81. // return
  82. //}
  83. //
  84. //data := sysmodel.LoginReturnInfo{}
  85. //data.Id = user.Id
  86. //data.LoginId = user.LoginId
  87. //data.Token = token.AccessToken
  88. //data.Type = user.Type
  89. //data.Domain = user.Domain
  90. //data.OrgId = businessUser.OrgId
  91. //data.Name = businessUser.Name
  92. //data.Mobile = businessUser.Mobile
  93. //data.Email = businessUser.Email
  94. //
  95. //// 查找用户对应角色
  96. //var roles []sysmodel.SysRole
  97. //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)
  98. //data.Roles = roles
  99. //erp插入的用户 判断用户状态是否禁用
  100. sql := fmt.Sprintf("select binding_id from school_account_binding where del_flag = 0 and user_id = ?")
  101. bindRes, err := c.App.GetBusinessDb(user.Domain).SQL(sql, user.Id).Query().List()
  102. if err != nil {
  103. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  104. return
  105. }
  106. if len(bindRes) >= 1 {
  107. erpUserId, ok := bindRes[0]["binding_id"]
  108. if ok {
  109. sql := fmt.Sprintf("select * from sys_user where del_flag = 0 and id = ?")
  110. erpRes, err := erpDb.NewSession().SQL(sql, erpUserId).Query().List()
  111. if err != nil {
  112. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  113. return
  114. }
  115. if len(erpRes) <= 0 {
  116. c.Ctx.JSON(200, sysmodel.SysReturn{400, "ERP账号不存在", nil})
  117. return
  118. }
  119. stauts, _ := erpRes[0]["status"]
  120. if stauts == "0" {
  121. c.Ctx.JSON(200, sysmodel.SysReturn{400, "ERP账号已经禁用", nil})
  122. return
  123. }
  124. }
  125. }
  126. data, err := AddToGlobalTokenStore(c, &user)
  127. if err != nil {
  128. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  129. return
  130. }
  131. //登录日志
  132. if session != nil {
  133. ip := RemoteIp(c.Ctx.Request)
  134. sql := "insert into log_sys_login (user_id,account,ip_addr,login_time,del_flag,login_type,user_name,resource_type) values (?, ?,?,?,?,?,?,?)"
  135. _, err = session.Exec(sql, user.Id, user.LoginId, ip, sysmodel.NowLocal().Value(), 0, 0, user.Name, "E-school账号")
  136. if err != nil {
  137. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  138. return
  139. }
  140. }
  141. //
  142. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", data})
  143. } else {
  144. //fmt.Println(err.Error())
  145. c.Ctx.JSON(200, sysmodel.SysReturn{400, "username or password incorrect!", nil})
  146. }
  147. }
  148. func (la *LightAuth) Logout(c *entitys.CtrlContext) {
  149. token := c.Ctx.GetHeader("token")
  150. //登录日志
  151. tokenStore := sysutils.GetGlobalTokenStore()
  152. tokenInfo := tokenStore.Get(token)
  153. fmt.Println("delete token: ", token)
  154. sysutils.GetGlobalTokenStore().Remove(token)
  155. user := new(sysmodel.SysUser)
  156. if session != nil && tokenInfo != nil {
  157. _, err := c.PlatformDbEngine.Table(user.TableName()).Where("login_id = ?", tokenInfo.LoginID).Get(user)
  158. if err != nil {
  159. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), 111})
  160. return
  161. }
  162. ip := RemoteIp(c.Ctx.Request)
  163. var resource_type string
  164. res, err := session.SQL("SELECT `resource_type` FROM `log_sys_login` WHERE (account = ?) ORDER BY id desc LIMIT 1", tokenInfo.LoginID).Query().List()
  165. if err != nil {
  166. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), 2222})
  167. return
  168. }
  169. if len(res) > 0 {
  170. resource_type, _ = res[0]["resource_type"].(string)
  171. }
  172. sql := "insert into log_sys_login (user_id,account,ip_addr,login_time,del_flag,login_type,user_name,resource_type) values (?, ?,?,?,?,?,?,?)"
  173. _, err = session.Exec(sql, user.Id, user.LoginId, ip, sysmodel.NowLocal().Value(), 0, 1, user.Name, resource_type)
  174. if err != nil {
  175. c.Ctx.JSON(200, sysmodel.SysReturn{400, err.Error(), nil})
  176. return
  177. }
  178. }
  179. //
  180. c.Ctx.JSON(200, sysmodel.SysReturn{200, "", nil})
  181. }
  182. const (
  183. XForwardedFor = "X-Forwarded-For"
  184. XRealIP = "X-Real-IP"
  185. )
  186. // RemoteIp 返回远程客户端的 IP,如 192.168.1.1
  187. func RemoteIp(req *http.Request) string {
  188. remoteAddr := req.RemoteAddr
  189. if ip := req.Header.Get(XRealIP); ip != "" {
  190. remoteAddr = ip
  191. } else if ip = req.Header.Get(XForwardedFor); ip != "" {
  192. remoteAddr = ip
  193. } else if ip = req.Header.Get("x-original-forwarded-for"); ip != "" {
  194. remoteAddr = ip
  195. } else {
  196. remoteAddr, _, _ = net.SplitHostPort(remoteAddr)
  197. }
  198. if remoteAddr == "::1" {
  199. remoteAddr = "127.0.0.1"
  200. }
  201. return remoteAddr
  202. }