Files
tyapi-server/internal/shared/middleware/domain.go
2025-08-02 05:38:35 +08:00

73 lines
1.6 KiB
Go

package middleware
import (
"strings"
"tyapi-server/internal/config"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
// DomainAuthMiddleware 域名认证中间件
type DomainAuthMiddleware struct {
config *config.Config
logger *zap.Logger
}
// NewDomainAuthMiddleware 创建域名认证中间件
func NewDomainAuthMiddleware(cfg *config.Config, logger *zap.Logger) *DomainAuthMiddleware {
return &DomainAuthMiddleware{
config: cfg,
logger: logger,
}
}
// GetName 返回中间件名称
func (m *DomainAuthMiddleware) GetName() string {
return "domain_auth"
}
// GetPriority 返回中间件优先级
func (m *DomainAuthMiddleware) GetPriority() int {
return 100
}
// Handle 返回中间件处理函数
func (m *DomainAuthMiddleware) Handle(domain string) gin.HandlerFunc {
return func(c *gin.Context) {
// 开发环境下跳过外部验证
if m.config.App.IsDevelopment() {
m.logger.Info("开发环境:跳过域名验证",
zap.String("domain", domain))
c.Next()
}
if domain == "" {
domain = m.config.API.Domain
}
host := c.Request.Host
// 移除端口部分
if idx := strings.Index(host, ":"); idx != -1 {
host = host[:idx]
}
m.logger.Info("域名认证中间件检查", zap.String("host", host), zap.String("domain", domain))
if host == domain || host == "api.tianyuanapi.com" || host == "apitest.tianyuanapi.com" {
// 设置域名匹配标记
c.Set("domainMatched", domain)
c.Next()
} else {
// 不匹配域名,跳过当前组处理,继续执行其他路由
c.Abort()
return
}
c.Next()
}
}
// IsGlobal 是否为全局中间件
func (m *DomainAuthMiddleware) IsGlobal() bool {
return false
}