Прежде чем ответить на ваш вопрос, я хотел бы сказать, что было бы более практичным ограничить доступ к приложению с помощью правил брандмауэра, а не в самой программе, но я отвлекся.
Чтобы ответить на ваш вопросвопрос, просмотрев ссылку на год godoc , я обнаружил, что контекстная структура содержит метод ClientIp()
, который:
реализует алгоритм наилучшего усилия длявозвращая реальный IP-адрес клиента, он анализирует X-Real-IP и X-Forwarded-For для правильной работы с такими обратными прокси, как us: nginx или haproxy.Используйте X-Forwarded-For перед X-Real-Ip, так как nginx использует X-Real-Ip с IP-адресом прокси.
Поэтому, если вы настроены на выполнение фильтрации IP в приложении, выможет фильтровать на основе значения, возвращаемого этим методом.
Используя базовый пример, приведенный на странице Github:
package main
import "github.com/gin-gonic/gin"
var Whitelist []string = []string{"1.2.3.4"}
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
whitelisted := false
for _, v := range Whitelist {
if v == c.ClientIP() {
whitelisted = true
}
}
if whitelisted {
c.JSON(200, gin.H{
"message": "pong",
})
} else {
c.JSON(403, gin.H{})
}
})
r.Run() // listen and serve on 0.0.0.0:8080
}