Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

token_service.go 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package token
  2. import (
  3. "context"
  4. "fmt"
  5. "git.x2erp.com/qdy/go-base/config"
  6. "git.x2erp.com/qdy/go-base/ctx"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. "git.x2erp.com/qdy/go-base/model/request/configreq"
  9. "git.x2erp.com/qdy/go-base/model/response"
  10. "git.x2erp.com/qdy/go-base/util"
  11. "git.x2erp.com/qdy/go-base/util/jwt"
  12. "git.x2erp.com/qdy/go-db/factory/database"
  13. "git.x2erp.com/qdy/go-svc-configure/internal/service/dao"
  14. )
  15. // CreateConfigureToken 用户为自己创建token(需要TokenAuth认证)
  16. func CreateConfigureToken(tokenRequest *configreq.ConfigTokenRequest, ctx context.Context, dbFactory *database.DBFactory, reqCtx *ctx.RequestContext) *response.QueryResult[string] {
  17. logger.Debug("CreateConfigureToken-开始创建用户token")
  18. // 获取当前用户信息
  19. currentUserID := reqCtx.UserID
  20. currentTenantID := reqCtx.TenantID
  21. if currentUserID == "" || currentTenantID == "" {
  22. logger.ErrorC(reqCtx, "用户身份信息不完整")
  23. return util.CreateErrorResult[string]("用户身份信息不完整", reqCtx)
  24. }
  25. db := dbFactory.GetDB()
  26. // 验证当前用户是否存在
  27. userExists, err := dao.CheckUserExists(ctx, db, currentUserID, currentTenantID)
  28. if err != nil {
  29. logger.ErrorC(reqCtx, fmt.Sprintf("检查用户存在性失败: %v", err))
  30. return util.CreateErrorResult[string](fmt.Sprintf("检查用户存在性失败: %v", err), reqCtx)
  31. }
  32. if !userExists {
  33. logger.ErrorC(reqCtx, "当前用户不存在")
  34. return util.CreateErrorResult[string]("当前用户不存在", reqCtx)
  35. }
  36. // 获取用户详细信息
  37. user, err := dao.GetUserByUserID(ctx, db, currentUserID, currentTenantID)
  38. if err != nil {
  39. logger.ErrorC(reqCtx, fmt.Sprintf("获取用户信息失败: %v", err))
  40. return util.CreateErrorResult[string](fmt.Sprintf("获取用户信息失败: %v", err), reqCtx)
  41. }
  42. // 获取用户角色列表
  43. roles, err := dao.GetUserRoles(ctx, db, currentUserID, currentTenantID)
  44. if err != nil {
  45. logger.ErrorC(reqCtx, fmt.Sprintf("获取用户角色失败: %v", err))
  46. // 继续处理,角色可能为空
  47. roles = []string{}
  48. }
  49. // 生成JWT token
  50. claims := &jwt.Claims{
  51. UserID: user.UserID,
  52. Username: user.Name,
  53. TenantID: user.TenantID,
  54. ProjectID: tokenRequest.ProjectID, // 使用请求中的项目ID
  55. Extra: map[string]interface{}{
  56. "roles": roles,
  57. "mobile": user.Mobile,
  58. "email": user.Email,
  59. },
  60. }
  61. secretKey := config.GetServiceConfig().SecretKey
  62. token, err := jwt.CreateTokenDays(claims, tokenRequest.ExpiresDays, secretKey)
  63. if err != nil {
  64. logger.ErrorC(reqCtx, fmt.Sprintf("建立token产生错误: %v", err))
  65. return util.CreateErrorResult[string](fmt.Sprintf("建立token产生错误: %v", err), reqCtx)
  66. }
  67. logger.Debug(fmt.Sprintf("建立token成功!用户: %s, 租户: %s, 角色: %v", user.UserID, user.TenantID, roles))
  68. return util.CreateSuccessResultData(token, reqCtx)
  69. }