Skip to content

Commit

Permalink
refactor(数据): 修改验证逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
Webb-L committed Feb 20, 2024
1 parent 0ec897b commit 97fa10d
Show file tree
Hide file tree
Showing 14 changed files with 180 additions and 165 deletions.
37 changes: 18 additions & 19 deletions app/controller/message_contoller.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package controller
import (
lang "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
"message/app/model"
"message/app/repository"
"message/app/request"
"message/app/response"
Expand All @@ -18,7 +17,7 @@ import (
// @Tags message
// @Accept json
// @Produce json
// @Security BasicAuth
// @Security ApiKeyAuth
// @Param filter query string false "过滤语句(title = 标题,status = 0|1|2,...)"
// @Param sortColumn query string false "排序列(created_at|updated_at|sender_ids|title|content|category|big_content|introducer_ids|status)"
// @Param sortType query string false "排序类型(asc/desc)"
Expand Down Expand Up @@ -47,7 +46,7 @@ func MessageIndex(ctx *gin.Context) {
}

// 将 token 转换为 MessageToken 类型
messageToken := token.(model.MessageToken)
messageToken := token.(string)
// 将 message 转换为 MessageRequest 类型
messageRequest := message.(*request.MessageRequest)

Expand All @@ -63,7 +62,7 @@ func MessageIndex(ctx *gin.Context) {
}
}

logs.LogInfo.Infof("MessageIndex %v %s", messageRequest, messageToken.AuthId)
logs.LogInfo.Infof("MessageIndex %v %s", messageRequest, messageToken)

// 返回查询结果
ctx.JSON(
Expand All @@ -83,7 +82,7 @@ func MessageIndex(ctx *gin.Context) {
// @Tags message
// @Accept json
// @Produce json
// @Security BasicAuth
// @Security ApiKeyAuth
// @Param _ body request.MessageCreateUpdateRequest true "创建的数据"
// @Success 200 {object} response.Message "创建成功"
// @Success 202 {object} response.HTTPError "创建失败"
Expand All @@ -108,7 +107,7 @@ func MessageCreate(ctx *gin.Context) {
}

// 将 token 转换为 MessageToken 类型
messageToken := token.(model.MessageToken)
messageToken := token.(string)
// 将 messageCreateUpdate 转换为 MessageCreateUpdateRequest 类型
messageCreateRequest := messageCreate.(*request.MessageCreateUpdateRequest)

Expand All @@ -126,11 +125,11 @@ func MessageCreate(ctx *gin.Context) {
lang.MustGetMessage(ctx, "createMessageFail"),
)

logs.LogInfo.Infof("MessageCreate-失败 %s %s", err, messageToken.AuthId)
logs.LogInfo.Infof("MessageCreate-失败 %s %s", err, messageToken)
return
}

logs.LogInfo.Infof("MessageCreate-成功 %s", messageToken.AuthId)
logs.LogInfo.Infof("MessageCreate-成功 %s", messageToken)

// 返回创建成功的消息
ctx.JSON(http.StatusOK, message)
Expand All @@ -143,7 +142,7 @@ func MessageCreate(ctx *gin.Context) {
// @Tags message
// @Accept json
// @Produce json
// @Security BasicAuth
// @Security ApiKeyAuth
// @Param id path string true "消息id"
// @Param _ body request.MessageCreateUpdateRequest true "更新消息"
// @Success 200 {object} response.Message "更新成功"
Expand All @@ -170,13 +169,13 @@ func MessageUpdate(ctx *gin.Context) {
}

// 将 token 转换为 MessageToken 类型
messageToken := token.(model.MessageToken)
messageToken := token.(string)
// 将 messageCreateUpdate 转换为 MessageCreateUpdateRequest 类型
messageUpdateRequest := messageUpdate.(*request.MessageCreateUpdateRequest)

// 根据id查询消息
oldMessage := repository.QueryMessageById(
messageToken.AuthId,
messageToken,
ctx.Param("id"),
)

Expand All @@ -203,11 +202,11 @@ func MessageUpdate(ctx *gin.Context) {
lang.MustGetMessage(ctx, "updateMessageFail"),
)

logs.LogInfo.Infof("MessageUpdate-失败 %s %s", err, messageToken.AuthId)
logs.LogInfo.Infof("MessageUpdate-失败 %s %s", err, messageToken)
return
}

logs.LogInfo.Infof("MessageUpdate-成功 %s", messageToken.AuthId)
logs.LogInfo.Infof("MessageUpdate-成功 %s", messageToken)

// 返回更新成功后的消息
ctx.JSON(http.StatusOK, messageNew)
Expand All @@ -220,7 +219,7 @@ func MessageUpdate(ctx *gin.Context) {
// @Tags message
// @Accept json
// @Produce json
// @Security BasicAuth
// @Security ApiKeyAuth
// @Param _ body []request.MessageStatusRequest true "消息状态"
// @Success 200 {object} []response.MessageStatusResponse "更新后返回的数据"
// @Failure 400 {object} request.ValidationError "请求参数错误"
Expand All @@ -244,11 +243,11 @@ func MessageUpdateStatus(ctx *gin.Context) {
}

// 将 token 转换为 MessageToken 类型
messageToken := token.(model.MessageToken)
messageToken := token.(string)
// 将 messageStatus 转换为 []MessageStatusRequest 类型
messageStatusRequest := messageStatus.(*[]request.MessageStatusRequest)

logs.LogInfo.Infof("MessageUpdateStatus %v %s", messageStatusRequest, messageToken.AuthId)
logs.LogInfo.Infof("MessageUpdateStatus %v %s", messageStatusRequest, messageToken)

// 更新消息状态,并返回更新后的结果
ctx.JSON(
Expand All @@ -267,7 +266,7 @@ func MessageUpdateStatus(ctx *gin.Context) {
// @Tags message
// @Accept json
// @Produce json
// @Security BasicAuth
// @Security ApiKeyAuth
// @Param _ body []request.MessageDeleteRequest true "删除的消息"
// @Success 200 {object} []response.MessageDeleteResponse "更新后返回的数据"
// @Failure 400 {object} request.ValidationError "请求参数错误"
Expand All @@ -292,11 +291,11 @@ func MessageDelete(ctx *gin.Context) {
}

// 将 token 转换为 MessageToken 类型
messageToken := token.(model.MessageToken)
messageToken := token.(string)
// 将 messageDelete 转换为 []MessageDeleteRequest 类型
messageDeleteRequests := messageDelete.(*[]request.MessageDeleteRequest)

logs.LogInfo.Infof("MessageDelete %v %s", messageDeleteRequests, messageToken.AuthId)
logs.LogInfo.Infof("MessageDelete %v %s", messageDeleteRequests, messageToken)

// 删除消息,并返回删除结果
ctx.JSON(
Expand Down
58 changes: 7 additions & 51 deletions app/middleware/auth_middleware.go
Original file line number Diff line number Diff line change
@@ -1,58 +1,20 @@
package middleware

import (
"encoding/base64"
"fmt"
lang "github.com/gin-contrib/i18n"
"github.com/gin-gonic/gin"
"message/app/repository"
"message/app/request"
"message/app/response"
"message/logs"
"net/http"
"strings"
)

// parseAuthorization 函数用于解析 Authorization 头中的 Basic token。
//
// 它接受一个字符串参数 basic,该字符串应包含完整的 Authorization 请求头的值。
//
// 函数返回一个包含两个字符串的切片和一个错误对象。
//
// 如果解析成功,切片中将包含从基于 Base64 编码的 token 中解码得到的信息;
//
// 如果解析失败,则返回一个错误。
func parseAuthorization(authorization string) (token []string, err error) {
// 使用空格将传入的 basic 字符串分割成两部分。
parts := strings.Split(authorization, " ")
// 检查分割后的结果是否正好两部分,并且第一部分(不区分大小写)是否为"basic"。
if len(parts) != 2 || strings.ToLower(parts[0]) != "basic" {
// 如果不满足条件,返回一个空的字符串切片和一个格式错误的错误信息。
return []string{}, fmt.Errorf("格式错误")
}

// 尝试对第二部分(即 Base64 编码的 token)进行解码。
decodeByte, err := base64.StdEncoding.DecodeString(parts[1])
if err != nil {
// 如果解码过程中发生错误,同样返回一个空的字符串切片和一个格式错误的错误信息。
return []string{}, fmt.Errorf("格式错误")
}

// 将解码后的字节序列转换为字符串,并以冒号为分隔符进行分割。
info := strings.Split(string(decodeByte), ":")
// 检查分割后的结果是否正好两部分,这通常对应于用户名和密码。
if len(info) != 2 {
// 如果不满足条件,再次返回一个空的字符串切片和一个格式错误的错误信息。
return []string{}, fmt.Errorf("格式错误")
}
// 如果所有检查都通过,则返回解析得到的信息和 nil 错误。
return info, nil
}

// AuthMiddleware 是一个 Gin 中间件函数,用于验证请求的授权信息。
//
// 该中间件从请求头中获取 Authorization,并解析为授权信息。
//
// 授权信息通过调用 repository.GetMessageToken() 方法获取消息令牌
// 授权信息通过调用 repository.GetMessageToken() 方法获取消息令牌是否有效
//
// 如果授权信息无效或获取消息令牌失败,则返回相应的错误响应。
//
Expand All @@ -61,21 +23,15 @@ func parseAuthorization(authorization string) (token []string, err error) {
// 返回一个 gin.HandlerFunc 处理程序函数。
func AuthMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
// 从请求头中获取 Authorization 并解析 Authorization
authorization, err := parseAuthorization(ctx.GetHeader("Authorization"))
if err != nil {
token := ctx.GetHeader("Authorization")
if err := request.Validate.Var(token, "required,len=32"); err != nil {
logs.LogInfo.Infof("AuthMiddleware-失败 %s %s", err, ctx.ClientIP())
response.NewError(
ctx,
http.StatusUnauthorized,
lang.MustGetMessage(ctx, "unauthorized"),
)
ctx.Abort()
request.HandlingValidateErrors(ctx, err)
return
}

// 获取消息令牌
token, err := repository.GetMessageToken(authorization[0], authorization[1])
_, err := repository.GetMessageToken(token)
if err != nil {
logs.LogInfo.Infof("AuthMiddleware-失败-找不到凭证 %s", ctx.ClientIP())
response.NewError(
Expand All @@ -87,7 +43,7 @@ func AuthMiddleware() gin.HandlerFunc {
return
}

logs.LogInfo.Infof("AuthMiddleware-成功 %s %s", ctx.ClientIP(), token.AuthId)
logs.LogInfo.Infof("AuthMiddleware-成功 %s %s", ctx.ClientIP(), token)
// 将消息令牌设置到上下文中
ctx.Set("token", token)
ctx.Next()
Expand Down
7 changes: 0 additions & 7 deletions app/model/message_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,5 @@ type Message struct {
Status uint8 `gorm:"type:tinyint;default:0;comment:消息阅读状态"`
}

// MessageToken 查询消息的凭证
type MessageToken struct {
gorm.Model `json:"_"`
AuthId string `json:"auth_id,omitempty" gorm:"type:varchar(32);index;unique;comment:"` // User字段长度为32
Token string `json:"token,omitempty" gorm:"type:varchar(255)"` // Token字段长度为255
}

type MessageCategory struct {
}
19 changes: 10 additions & 9 deletions app/repository/auto_repository.go
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
package repository

import (
"message/app/model"
"fmt"
"message/config"
"message/database"
)

// GetMessageToken 尝试获取一个符合指定条件的MessageToken。
//
// 它返回找到的MessageToken和可能出现的错误。如果记录不存在,将返回nil和gorm.ErrRecordNotFound。
func GetMessageToken(authId string, authToken string) (model.MessageToken, error) {
var token model.MessageToken
result := database.DB.Model(model.MessageToken{}).
Where("auth_id = ?", authId).
Where("token = ?", authToken).
First(&token)
func GetMessageToken(messageToken string) (bool, error) {
verify := config.AppConfig.App.Verify
result := database.DB.Table(verify.Table).
Select(verify.Column).
Where(fmt.Sprintf("%s = ?", verify.Column), messageToken).
Limit(1)

if result.Error != nil {
// 直接返回错误,包括未找到记录的情况
return token, result.Error
return false, result.Error
}

// 记录被成功找到,返回token的指针和nil作为错误
return token, nil
return true, nil
}
22 changes: 11 additions & 11 deletions app/repository/message_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
// QueryMessagesByMessageTokenMessageRequest 根据消息凭证和消息请求查询消息
func QueryMessagesByMessageTokenMessageRequest(
// 消息凭证
token model.MessageToken,
token string,
// 消息请求参数
messageRequest *request.MessageRequest,
// 消息过滤器
Expand All @@ -29,7 +29,7 @@ func QueryMessagesByMessageTokenMessageRequest(
query.Where(
query.Where(
"introducer_ids LIKE ?",
fmt.Sprintf("%%%s%%", token.AuthId),
fmt.Sprintf("%%%s%%", token),
).Or("introducer_ids = ?", ""),
)

Expand Down Expand Up @@ -84,7 +84,7 @@ func QueryMessagesByMessageTokenMessageRequest(

// CreateMessage 创建一条新消息
func CreateMessage(
token model.MessageToken,
token string,
createMessage *request.MessageCreateUpdateRequest,
) (*response.Message, error) {
messageId := utils.BuildMessageId()
Expand All @@ -93,7 +93,7 @@ func CreateMessage(
// 生成消息 ID
MessageId: messageId,
// 设置消息的发送者 ID
SenderIds: []string{token.AuthId},
SenderIds: []string{token},
// 设置消息标题
Title: createMessage.Title,
// 设置消息内容
Expand Down Expand Up @@ -150,7 +150,7 @@ func UpdateMessage(
// UpdateMessageStatus 更新消息状态
func UpdateMessageStatus(
// 消息凭证
token model.MessageToken,
token string,
// 要更新的状态请求切片
status *[]request.MessageStatusRequest,
) []response.MessageStatusResponse {
Expand All @@ -162,7 +162,7 @@ func UpdateMessageStatus(
// 对model.Message模型执行更新操作,设置新的状态
// 使用LIKE查询匹配introducer_ids,并确保message_id与AuthId相符
result := database.DB.Model(&model.Message{}).
Where("introducer_ids LIKE ?", fmt.Sprintf("%%%s%%", token.AuthId)).
Where("introducer_ids LIKE ?", fmt.Sprintf("%%%s%%", token)).
Where("message_id = ?", statusRequest.Id).
Update("status", statusRequest.Status)

Expand Down Expand Up @@ -206,7 +206,7 @@ func QueryMessageById(
// DeleteMessagesById 根据消息 ID 批量删除消息
func DeleteMessagesById(
// 消息凭证
token model.MessageToken,
token string,
// 要删除的消息请求切片
deleteRequests *[]request.MessageDeleteRequest,
) []response.MessageDeleteResponse {
Expand All @@ -226,28 +226,28 @@ func DeleteMessagesById(

// 物理删除要删除的消息
database.DB.Unscoped().
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token.AuthId)).
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token)).
Where("message_id in ?", deletes).
Delete(&model.Message{})

// 软删除要软删除的消息
database.DB.
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token.AuthId)).
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token)).
Where("message_id in ?", softDeletes).
Delete(&model.Message{})

// 存储物理删除失败的消息 ID
var failDeletes []string
database.DB.
Select("message_id").
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token.AuthId)).
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token)).
Where("message_id in ?", softDeletes).Find(&failDeletes)

// 存储软删除失败的消息 ID
var failSoftDeletes []string
database.DB.
Select("message_id").
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token.AuthId)).
Where("sender_ids LIKE ?", fmt.Sprintf("%%%s%%", token)).
Where("message_id in ?", softDeletes).Find(&failSoftDeletes)

// 存储删除操作的结果切片
Expand Down
Loading

0 comments on commit 97fa10d

Please sign in to comment.