auth.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package auth
  2. import (
  3. "git.sxidc.com/go-framework/baize/convenient/domain/auth/middlewares"
  4. "git.sxidc.com/go-framework/baize/convenient/domain/auth/permission"
  5. "git.sxidc.com/go-framework/baize/convenient/domain/auth/permission_group"
  6. "git.sxidc.com/go-framework/baize/convenient/domain/auth/relations"
  7. "git.sxidc.com/go-framework/baize/convenient/domain/auth/role"
  8. "git.sxidc.com/go-framework/baize/convenient/domain/auth/user"
  9. "git.sxidc.com/go-framework/baize/framework/binding"
  10. "git.sxidc.com/go-framework/baize/framework/core/api"
  11. "git.sxidc.com/go-framework/baize/framework/core/api/request"
  12. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  13. "git.sxidc.com/go-framework/baize/framework/core/domain"
  14. "git.sxidc.com/go-framework/baize/framework/core/domain/entity"
  15. "git.sxidc.com/go-framework/baize/framework/core/infrastructure"
  16. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database"
  17. "git.sxidc.com/go-framework/baize/framework/core/infrastructure/database/sql"
  18. "git.sxidc.com/go-tools/utils/encoding"
  19. "github.com/pkg/errors"
  20. )
  21. // Simple Bind参数
  22. type Simple struct {
  23. // schema
  24. Schema string
  25. // AES加密用到的Key
  26. AESKey string
  27. // JWT的Key
  28. JWTSecretKey string
  29. // JWT到期时间
  30. JWTExpiredSec int64
  31. }
  32. func (simple *Simple) bind(binder *binding.Binder) {
  33. (&permission.Simple{Schema: simple.Schema}).Bind(binder)
  34. (&permission_group.Simple{Schema: simple.Schema}).Bind(binder)
  35. (&role.Simple{Schema: simple.Schema}).Bind(binder)
  36. (&user.Simple{Schema: simple.Schema, AESKey: simple.AESKey}).Bind(binder)
  37. (&relations.Simple{Schema: simple.Schema}).Bind(binder)
  38. // 登录
  39. binding.PostBind(binder, &binding.SimpleBindItem[map[string]any]{
  40. Path: "/login",
  41. SendResponseFunc: response.SendMapResponse,
  42. RequestParams: &LoginJsonBody{},
  43. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (map[string]any, error) {
  44. errResponse := map[string]any{
  45. "token": "",
  46. }
  47. jsonBody, err := request.ToConcrete[*LoginJsonBody](params)
  48. if err != nil {
  49. return errResponse, err
  50. }
  51. encryptedPassword, err := encoding.AESEncrypt(jsonBody.Password, simple.AESKey)
  52. if err != nil {
  53. return errResponse, errors.New(err.Error())
  54. }
  55. userTableName := domain.TableName(simple.Schema, &user.Entity{})
  56. dbExecutor := i.DBExecutor()
  57. result, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  58. TableName: userTableName,
  59. Conditions: sql.NewConditions().
  60. Equal(user.ColumnUserName, jsonBody.UserName).
  61. Equal(user.ColumnPassword, encryptedPassword),
  62. })
  63. if err != nil {
  64. if database.IsErrorDBRecordNotExist(err) {
  65. return errResponse, errors.New("用户名或密码错误")
  66. }
  67. return errResponse, errors.New(err.Error())
  68. }
  69. existUser := new(user.Entity)
  70. err = sql.ParseSqlResult(result, existUser)
  71. if err != nil {
  72. return errResponse, err
  73. }
  74. token, err := newJWT(simple.JWTSecretKey, existUser.ID, simple.JWTExpiredSec)
  75. if err != nil {
  76. return errResponse, errors.New(err.Error())
  77. }
  78. err = database.Update(dbExecutor, &sql.UpdateExecuteParams{
  79. TableName: userTableName,
  80. TableRow: sql.NewTableRow().Add(user.ColumnToken, token),
  81. Conditions: sql.NewConditions().Equal(entity.ColumnID, existUser.ID),
  82. })
  83. if err != nil {
  84. return errResponse, errors.New(err.Error())
  85. }
  86. return map[string]any{
  87. "token": token,
  88. }, nil
  89. },
  90. })
  91. // 注销
  92. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  93. Path: "/logout",
  94. SendResponseFunc: response.SendMsgResponse,
  95. ServiceFunc: func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (any, error) {
  96. errResponse := map[string]any{
  97. "token": "",
  98. }
  99. jsonBody, err := request.ToConcrete[*LoginJsonBody](params)
  100. if err != nil {
  101. return errResponse, err
  102. }
  103. encryptedPassword, err := encoding.AESEncrypt(jsonBody.Password, simple.AESKey)
  104. if err != nil {
  105. return errResponse, errors.New(err.Error())
  106. }
  107. userTableName := domain.TableName(simple.Schema, &user.Entity{})
  108. dbExecutor := i.DBExecutor()
  109. result, err := database.QueryOne(dbExecutor, &sql.QueryOneExecuteParams{
  110. TableName: userTableName,
  111. Conditions: sql.NewConditions().
  112. Equal(user.ColumnUserName, jsonBody.UserName).
  113. Equal(user.ColumnPassword, encryptedPassword),
  114. })
  115. if err != nil {
  116. if database.IsErrorDBRecordNotExist(err) {
  117. return errResponse, errors.New("用户名或密码错误")
  118. }
  119. return errResponse, errors.New(err.Error())
  120. }
  121. existUser := new(user.Entity)
  122. err = sql.ParseSqlResult(result, existUser)
  123. if err != nil {
  124. return errResponse, err
  125. }
  126. token, err := newJWT(simple.JWTSecretKey, existUser.ID, simple.JWTExpiredSec)
  127. if err != nil {
  128. return errResponse, errors.New(err.Error())
  129. }
  130. err = database.Update(dbExecutor, &sql.UpdateExecuteParams{
  131. TableName: userTableName,
  132. TableRow: sql.NewTableRow().Add(user.ColumnToken, token),
  133. Conditions: sql.NewConditions().Equal(entity.ColumnID, existUser.ID),
  134. })
  135. if err != nil {
  136. return errResponse, errors.New(err.Error())
  137. }
  138. return map[string]any{
  139. "token": token,
  140. }, nil
  141. },
  142. }, middlewares.Authentication())
  143. // TODO Challenge
  144. }
  145. func BindAuth(binder *binding.Binder, simple *Simple) {
  146. simple.bind(binder)
  147. }