auth.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package middleware
  2. import (
  3. "baize_scaffold/gateway/gw/config"
  4. "net/http"
  5. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  6. "git.sxidc.com/go-framework/baize/framework/gateway"
  7. "git.sxidc.com/service-supports/fslog"
  8. "github.com/dgrijalva/jwt-go/request"
  9. "github.com/pkg/errors"
  10. )
  11. type AuthenticationResult struct {
  12. response.MsgResponse
  13. TenantID string `json:"tenantId"`
  14. TenantName string `json:"tenantName"`
  15. UserID string `json:"userId"`
  16. UserName string `json:"userName"`
  17. Roles []Role `json:"roles"`
  18. }
  19. type Role struct {
  20. ID string `json:"id"`
  21. Name string `json:"name"`
  22. }
  23. type TenantInfo struct {
  24. ID string
  25. Name string
  26. }
  27. func (t TenantInfo) GetID() string {
  28. return t.ID
  29. }
  30. func (t TenantInfo) GetName() string {
  31. return t.Name
  32. }
  33. type UserInfo struct {
  34. ID string
  35. UserName string
  36. Roles []Role
  37. }
  38. func (u UserInfo) GetID() string {
  39. return u.ID
  40. }
  41. func (u UserInfo) GetUserName() string {
  42. return u.UserName
  43. }
  44. func (u UserInfo) GetName() string {
  45. return u.UserName
  46. }
  47. func Authentication() gateway.Handler {
  48. return func(requestBuilder *gateway.RequestBuilder) {
  49. c := requestBuilder.ApiContext()
  50. respFunc := response.SendMapResponse
  51. token, err := request.AuthorizationHeaderExtractor.ExtractToken(c.Request)
  52. if err != nil {
  53. fslog.Error(err)
  54. respFunc(c, http.StatusUnauthorized, map[string]any{
  55. "accessToken": "",
  56. }, err)
  57. c.Abort()
  58. return
  59. }
  60. var requestErr error
  61. authResult := new(AuthenticationResult)
  62. requestBuilder.Post(&gateway.PostRequest{
  63. Url: config.GetGatewayConfig().ServicesConfig.UMBaseUrl + "/utm/api/v1/auth",
  64. Body: map[string]any{
  65. "token": token,
  66. "resource": c.FullPath(),
  67. "action": c.Request.Method,
  68. },
  69. }).ResponseErrorCallback(func(c *gateway.RequestBuilderContext, err error) {
  70. requestErr = err
  71. }).ResponseSuccessCallback(func(c *gateway.RequestBuilderContext) {
  72. err := c.HistoryRequests()[0].Response().Json(authResult)
  73. if err != nil {
  74. requestErr = err
  75. return
  76. }
  77. if !authResult.Success {
  78. requestErr = errors.New(authResult.Msg)
  79. return
  80. }
  81. return
  82. }).Request()
  83. if requestErr != nil {
  84. fslog.Error(err)
  85. respFunc(requestBuilder.ApiContext(), http.StatusUnauthorized, map[string]any{
  86. "accessToken": "",
  87. }, requestErr)
  88. requestBuilder.ApiContext().Abort()
  89. return
  90. }
  91. c.SetUserInfo(&UserInfo{
  92. ID: authResult.UserID,
  93. UserName: authResult.UserName,
  94. Roles: authResult.Roles,
  95. })
  96. c.SetTenantInfo(&TenantInfo{
  97. ID: authResult.TenantID,
  98. Name: authResult.TenantName,
  99. })
  100. c.Next()
  101. }
  102. }