login_auth.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "github.com/sirupsen/logrus"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "youngee_m_api/consts"
  12. "youngee_m_api/db"
  13. "youngee_m_api/model/http_model"
  14. "youngee_m_api/model/redis_model"
  15. "youngee_m_api/model/system_model"
  16. "youngee_m_api/redis"
  17. "youngee_m_api/util"
  18. )
  19. var LoginAuth *loginAuth
  20. func LoginAuthInit(config *system_model.Session) {
  21. auth := new(loginAuth)
  22. auth.sessionTTL = time.Duration(config.TTL) * time.Minute
  23. LoginAuth = auth
  24. }
  25. type loginAuth struct {
  26. sessionTTL time.Duration
  27. }
  28. func (l *loginAuth) AuthToken(ctx context.Context, token string) (*http_model.UserInfoResponse, error) {
  29. user, err := l.parseToken(ctx, token)
  30. if err != nil {
  31. logrus.Debug("token格式错误:%+v", token)
  32. return nil, err
  33. }
  34. auth, err := l.getSessionAuth(ctx, user)
  35. if err != nil {
  36. logrus.Debug("获取session redis错误: token:%+v,err:%+v", token, err)
  37. return nil, err
  38. }
  39. if auth.Token != token {
  40. logrus.Debug("获取session time过期错误: token:%+v", token)
  41. return nil, errors.New("auth failed")
  42. }
  43. var loginUser http_model.UserInfoResponse
  44. if auth.Role == "1" {
  45. //主账号
  46. loginUser = http_model.UserInfoResponse{
  47. User: auth.User,
  48. Username: auth.Username,
  49. Role: auth.Role,
  50. JobName: "主账号无岗位",
  51. AccountId: auth.ID,
  52. SubAccountId: 0,
  53. WorkspacePermission: "1",
  54. TaskcenterPermission: "1",
  55. SectaskPermission: "1",
  56. FinancialPermission: "1",
  57. OperatePermission: "1",
  58. UsercenterPermission: "1",
  59. }
  60. } else {
  61. subaccount, err := db.FindSubAccountById(ctx, auth.ID)
  62. if err != nil {
  63. return nil, err
  64. }
  65. jobinfo, err := db.GetJob(ctx, subaccount.JobId)
  66. if err != nil {
  67. return nil, err
  68. }
  69. loginUser = http_model.UserInfoResponse{
  70. User: auth.User,
  71. Username: auth.Username,
  72. Role: auth.Role,
  73. JobName: jobinfo.JobName,
  74. AccountId: auth.ID,
  75. SubAccountId: subaccount.SubAccountId,
  76. WorkspacePermission: jobinfo.WorkshopPermission,
  77. TaskcenterPermission: jobinfo.TaskcenterPermission,
  78. SectaskPermission: jobinfo.SectaskPermisson,
  79. FinancialPermission: jobinfo.FinancialPermission,
  80. OperatePermission: jobinfo.OperatePermission,
  81. UsercenterPermission: jobinfo.UsercenterPermission,
  82. }
  83. }
  84. return &loginUser, nil
  85. }
  86. func (l *loginAuth) AuthCode(ctx context.Context, User string, password string) (error, *http_model.CodeLoginData) {
  87. user, err := db.GetUser(ctx, User)
  88. var loginuserdata http_model.CodeLoginData
  89. if err != nil {
  90. return err, nil
  91. } else if user == nil {
  92. // 账号不存在
  93. logrus.Debugf("[AuthCode] auth fail,User:%+v", User)
  94. loginuserdata.Token = "账号不存在"
  95. return errors.New("auth fail"), &loginuserdata
  96. } else if string(user.Role) != consts.BRole && string(user.Role) != consts.BRole2 {
  97. // 账号权限有误
  98. logrus.Debugf("[AuthCode] auth fail,User:%+v", User)
  99. loginuserdata.Token = "权限错误,请登录管理账号"
  100. return errors.New("auth fail"), &loginuserdata
  101. } else if string(user.UserState) != "1" {
  102. // 账号已经被禁用
  103. logrus.Debugf("[AuthCode] auth fail,User:%+v", User)
  104. loginuserdata.Token = "账号已经被禁用"
  105. return errors.New("auth fail"), &loginuserdata
  106. }
  107. var token string
  108. if user.Password == password {
  109. token = l.getToken(ctx, user.User)
  110. auth := &redis_model.Auth{
  111. Phone: user.Phone,
  112. ID: user.ID,
  113. User: user.User,
  114. Username: user.Username,
  115. RealName: user.RealName,
  116. Role: user.Role,
  117. Email: user.Email,
  118. Token: token,
  119. }
  120. if err := l.setSession(ctx, user.User, auth); err != nil {
  121. fmt.Printf("setSession error\n")
  122. return err, nil
  123. }
  124. }
  125. if user.Role == "1" {
  126. //主账号
  127. loginuserdata = http_model.CodeLoginData{
  128. Token: token,
  129. Username: user.Username,
  130. Role: user.Role,
  131. JobName: "主账号无岗位",
  132. AccountId: user.ID,
  133. SubAccountId: 0,
  134. WorkspacePermission: "1",
  135. TaskcenterPermission: "1",
  136. SectaskPermission: "1",
  137. FinancialPermission: "1",
  138. OperatePermission: "1",
  139. UsercenterPermission: "1",
  140. }
  141. } else {
  142. subaccount, err := db.FindSubAccountById(ctx, user.ID)
  143. if err != nil {
  144. return err, nil
  145. }
  146. jobinfo, err := db.GetJob(ctx, subaccount.JobId)
  147. if err != nil {
  148. return err, nil
  149. }
  150. loginuserdata = http_model.CodeLoginData{
  151. Token: token,
  152. Username: user.Username,
  153. Role: user.Role,
  154. JobName: jobinfo.JobName,
  155. AccountId: user.ID,
  156. SubAccountId: subaccount.SubAccountId,
  157. WorkspacePermission: jobinfo.WorkshopPermission,
  158. TaskcenterPermission: jobinfo.TaskcenterPermission,
  159. SectaskPermission: jobinfo.SectaskPermisson,
  160. FinancialPermission: jobinfo.FinancialPermission,
  161. OperatePermission: jobinfo.OperatePermission,
  162. UsercenterPermission: jobinfo.UsercenterPermission,
  163. }
  164. }
  165. return nil, &loginuserdata
  166. }
  167. func (l *loginAuth) setSession(ctx context.Context, user string, auth *redis_model.Auth) error {
  168. if authJson, err := json.Marshal(auth); err == nil {
  169. err = redis.Set(ctx, l.getRedisKey(user), string(authJson), l.sessionTTL)
  170. if err == nil {
  171. return err
  172. }
  173. }
  174. return nil
  175. }
  176. //func (l *loginAuth) getSessionCode(ctx context.Context, phone string) (*string, error) {
  177. // value, err := redis.Get(ctx, l.getRedisKey(phone))
  178. // if err != nil {
  179. // if err == consts.RedisNil {
  180. // return nil, fmt.Errorf("not found in redis,phone:%+v", phone)
  181. // }
  182. // return nil, err
  183. // }
  184. // return &value, nil
  185. //}
  186. func (l *loginAuth) getSessionAuth(ctx context.Context, user string) (*redis_model.Auth, error) {
  187. value, err := redis.Get(ctx, l.getRedisKey(user))
  188. if err != nil {
  189. if err == consts.RedisNil {
  190. return nil, fmt.Errorf("not found in redis,user:%+v", user)
  191. }
  192. return nil, err
  193. }
  194. auth := new(redis_model.Auth)
  195. if err = json.Unmarshal([]byte(value), auth); err != nil {
  196. return nil, err
  197. }
  198. return auth, nil
  199. }
  200. func (l *loginAuth) getToken(ctx context.Context, user string) string {
  201. timeSeed := strconv.FormatInt(time.Now().Unix(), 10)
  202. token := user + "." + timeSeed + "." + util.MD5(user, timeSeed, consts.AuthSalt)
  203. return token
  204. }
  205. func (l *loginAuth) parseToken(ctx context.Context, token string) (string, error) {
  206. parts := strings.Split(token, ".")
  207. if len(parts) == 3 {
  208. user := parts[0]
  209. timeSeed := parts[1]
  210. if parts[2] == util.MD5(user, timeSeed, consts.AuthSalt) {
  211. return user, nil
  212. }
  213. }
  214. return "", errors.New("token invalid")
  215. }
  216. func (l *loginAuth) encryptPassword(password string) string {
  217. return util.MD5(password)
  218. }
  219. func (l *loginAuth) getRedisKey(key string) string {
  220. return fmt.Sprintf("%s%s", consts.SessionRedisPrefix, key)
  221. }