ws_service.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package services
  2. import (
  3. "eta/eta_api/models"
  4. "eta/eta_api/models/system"
  5. "eta/eta_api/utils"
  6. "eta/eta_api/utils/ws"
  7. "fmt"
  8. "github.com/beego/beego/v2/server/web"
  9. "github.com/beego/beego/v2/server/web/context"
  10. "net/http"
  11. "strings"
  12. "time"
  13. )
  14. var ()
  15. func WsAuthenticate() web.FilterFunc {
  16. return func(ctx *context.Context) {
  17. method := ctx.Input.Method()
  18. uri := ctx.Input.URI()
  19. if method == "POST" || method == "GET" {
  20. authorization := ctx.Input.Header("authorization")
  21. if authorization == "" {
  22. authorization = ctx.Input.Header("Authorization")
  23. }
  24. if strings.Contains(authorization, ";") {
  25. authorization = strings.Replace(authorization, ";", "$", 1)
  26. }
  27. if authorization == "" {
  28. strArr := strings.Split(uri, "?")
  29. for k, v := range strArr {
  30. fmt.Println(k, v)
  31. }
  32. if len(strArr) > 1 {
  33. authorization = strArr[1]
  34. authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
  35. }
  36. }
  37. if authorization == "" {
  38. utils.FileLog.Error("authorization为空,未授权")
  39. ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
  40. return
  41. }
  42. tokenStr := authorization
  43. tokenArr := strings.Split(tokenStr, "=")
  44. token := tokenArr[1]
  45. session, err := system.GetSysSessionByToken(token)
  46. if err != nil {
  47. if utils.IsErrNoRow(err) {
  48. utils.FileLog.Error("authorization已过期")
  49. ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
  50. return
  51. }
  52. utils.FileLog.Error("authorization查询用户信息失败")
  53. ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  54. return
  55. }
  56. if session == nil {
  57. utils.FileLog.Error("会话不存在")
  58. ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  59. return
  60. }
  61. //校验token是否合法
  62. // JWT校验Token和Account
  63. account := utils.MD5(session.UserName)
  64. if !utils.CheckToken(account, token) {
  65. utils.FileLog.Error("authorization校验不合法")
  66. ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
  67. return
  68. }
  69. if time.Now().After(session.ExpiredTime) {
  70. utils.FileLog.Error("authorization过期法")
  71. ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
  72. return
  73. }
  74. admin, err := system.GetSysUserById(session.SysUserId)
  75. if err != nil {
  76. if utils.IsErrNoRow(err) {
  77. utils.FileLog.Error("权限不够")
  78. ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
  79. return
  80. }
  81. utils.FileLog.Error("获取用户信息失败")
  82. ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  83. return
  84. }
  85. if admin == nil {
  86. utils.FileLog.Error("权限不够")
  87. ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
  88. return
  89. }
  90. //如果不是启用状态
  91. if admin.Enabled != 1 {
  92. utils.FileLog.Error("用户被禁用")
  93. ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
  94. return
  95. }
  96. //接口权限校验
  97. roleId := admin.RoleId
  98. list, e := system.GetMenuButtonApisByRoleId(roleId)
  99. if e != nil {
  100. utils.FileLog.Error("接口权限查询出错", e)
  101. ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
  102. return
  103. }
  104. var api string
  105. for _, v := range list {
  106. if v.Api != "" {
  107. api += v.Api + "&"
  108. }
  109. }
  110. api += "&" + models.BusinessConfMap["PublicApi"]
  111. //处理uri请求,去除前缀和参数
  112. api = strings.TrimRight(api, "&")
  113. uri = strings.Replace(uri, "/adminapi", "", 1)
  114. uris := strings.Split(uri, "?")
  115. uri = uris[0]
  116. //fmt.Println("uri:", uri)
  117. apis := strings.Split(api, "&")
  118. apiMap := make(map[string]bool, 0)
  119. for _, s := range apis {
  120. apiMap[s] = true
  121. }
  122. if !apiMap[uri] {
  123. utils.FileLog.Error("用户无权访问")
  124. ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
  125. return
  126. }
  127. ctx.Input.SetData("admin", admin)
  128. } else {
  129. utils.FileLog.Error("请求方法类型错误")
  130. ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  131. return
  132. }
  133. }
  134. }
  135. func StartSessionManager() {
  136. ws.GetInstance().Start()
  137. }