73 lines
1.6 KiB
Go
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
|
|
}
|