auth.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package service
  2. import (
  3. "baize_scaffold/utm/application/domain/auth"
  4. "baize_scaffold/utm/data_loader"
  5. "baize_scaffold/utm/tools"
  6. "fmt"
  7. "git.sxidc.com/go-framework/baize/framework/binding"
  8. "git.sxidc.com/go-framework/baize/framework/core/api"
  9. "git.sxidc.com/go-framework/baize/framework/core/api/request"
  10. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  11. "git.sxidc.com/go-framework/baize/framework/core/application"
  12. "git.sxidc.com/go-framework/baize/framework/core/domain"
  13. "git.sxidc.com/go-framework/baize/framework/core/infrastructure"
  14. "github.com/pkg/errors"
  15. )
  16. var authService = &AuthService{}
  17. type AuthService struct{}
  18. func (svc *AuthService) Init(appInstance *application.App) error {
  19. svc.root(appInstance)
  20. svc.v1(appInstance)
  21. return nil
  22. }
  23. func (svc *AuthService) Destroy() error {
  24. return nil
  25. }
  26. func (svc *AuthService) root(appInstance *application.App) {
  27. rootBinder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, ""), nil)
  28. binding.PostBind(rootBinder, &binding.SimpleBindItem[map[string]any]{
  29. Path: "/login",
  30. SendResponseFunc: response.SendMapResponse,
  31. RequestParams: &auth.LoginJsonBody{},
  32. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (map[string]any, error) {
  33. errResponse := map[string]any{
  34. "token": "",
  35. }
  36. jsonBody, err := request.ToConcrete[*auth.LoginJsonBody](params)
  37. if err != nil {
  38. return errResponse, err
  39. }
  40. user, err := data_loader.GetDataLoader().GetUserByUserNameAndPassword(jsonBody.UserName, jsonBody.Password)
  41. if err != nil {
  42. return errResponse, err
  43. }
  44. token, err := tools.NewJWT(user.ID, 0)
  45. if err != nil {
  46. return errResponse, err
  47. }
  48. return map[string]any{
  49. "token": token,
  50. }, nil
  51. },
  52. })
  53. }
  54. func (svc *AuthService) v1(appInstance *application.App) {
  55. v1Binder := binding.NewBinder(appInstance.ChooseRouter(api.RouterPrefix, "v1"), nil)
  56. binding.PostBind(v1Binder, &binding.SimpleBindItem[map[string]any]{
  57. Path: "/auth",
  58. SendResponseFunc: response.SendMapResponse,
  59. RequestParams: &auth.CheckTokenJsonBody{},
  60. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (map[string]any, error) {
  61. errResponse := map[string]any{
  62. "result": &auth.AuthenticationResult{},
  63. }
  64. jsonBody, err := request.ToConcrete[*auth.CheckTokenJsonBody](params)
  65. if err != nil {
  66. return errResponse, err
  67. }
  68. valid, userID, err := tools.CheckJWT(jsonBody.Token)
  69. if err != nil {
  70. return errResponse, err
  71. }
  72. if !valid {
  73. return errResponse, errors.New("token无效")
  74. }
  75. user, err := data_loader.GetDataLoader().GetUserByID(userID)
  76. if err != nil {
  77. return errResponse, err
  78. }
  79. tenant, err := data_loader.GetDataLoader().GetTenantByID(user.CurrentTenantID)
  80. if err != nil {
  81. return errResponse, err
  82. }
  83. roles, err := data_loader.GetDataLoader().GetRolesByIDs(user.RoleIDs)
  84. if err != nil {
  85. return errResponse, err
  86. }
  87. find := false
  88. for _, role := range roles {
  89. for _, permission := range role.Permissions {
  90. if permission.Resource == jsonBody.Resource && permission.Action == jsonBody.Action {
  91. find = true
  92. break
  93. }
  94. }
  95. }
  96. if !find {
  97. return errResponse, errors.New(fmt.Sprintf("用户无权限: Resource: %s, Action: %s",
  98. jsonBody.Resource, jsonBody.Action))
  99. }
  100. resultRoles := make([]auth.Role, 0)
  101. for _, role := range roles {
  102. resultRolePermissions := make([]auth.Permission, 0)
  103. for _, permission := range role.Permissions {
  104. resultRolePermissions = append(resultRolePermissions, auth.Permission{
  105. Resource: permission.Resource,
  106. Action: permission.Action,
  107. })
  108. }
  109. resultRoles = append(resultRoles, auth.Role{
  110. ID: role.ID,
  111. Name: role.Name,
  112. Permissions: resultRolePermissions,
  113. })
  114. }
  115. return map[string]any{
  116. "result": &auth.AuthenticationResult{
  117. TenantID: tenant.ID,
  118. TenantName: tenant.Name,
  119. UserID: user.ID,
  120. UserName: user.UserName,
  121. Roles: resultRoles,
  122. },
  123. }, nil
  124. },
  125. })
  126. }