新增可配置的 real_ip_headers(默认 CF-Connecting-IP > X-Real-IP > X-Forwarded-For 降级取值),trusted_proxies 用于 gin 代理信任链。 WebSocket 连接建立时捕获真实 IP 并在 /profile 和 /admin 连接列表展示, 登录会话 IP 同步改用真实 IP。
29 lines
458 B
Go
29 lines
458 B
Go
package middleware
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
var realIPHeaders []string
|
|
|
|
func SetRealIPHeaders(headers []string) {
|
|
realIPHeaders = headers
|
|
}
|
|
|
|
func GetRealIP(c *gin.Context) string {
|
|
for _, header := range realIPHeaders {
|
|
val := c.GetHeader(header)
|
|
if val == "" {
|
|
continue
|
|
}
|
|
ip := strings.TrimSpace(strings.Split(val, ",")[0])
|
|
if ip != "" && net.ParseIP(ip) != nil {
|
|
return ip
|
|
}
|
|
}
|
|
return c.ClientIP()
|
|
}
|