Есть ли хороший способ отфильтровать запросы по IP-адресу с помощью Echo?
Я занимаюсь разработкой API-сервера с Echo HTTP Framework. Я хотел бы отфильтровать некоторые запросы по IP-адресу.
Позже я смогу лучше управлять этими URL.
Это мой код:
func filterIP(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
fmt.Println("c.RealIP()=", c.RealIP())
fmt.Println("c.Path()", c.Path())
if isFilterIp(c.RealIP(), c.Path()) {
return echo.NewHTTPError(http.StatusUnauthorized,
fmt.Sprintf("IP address %s not allowed", c.RealIP()))
}
return next(c)
}
}
func main() {
e := echo.New()
filterGroup := e.Group("/filter")
filterGroup.Use(filterIP)
filterGroup.GET("/test", func(c echo.Context) error {
return c.String(http.StatusOK, "test filter")
})
noFilterGroup := e.Group("/noFilter")
noFilterGroup.GET("/test", func(c echo.Context) error {
return c.String(http.StatusOK, "test no filter")
})
e.Logger.Fatal(e.Start(":1323"))
}
И я хочу отфильтровать IP-адрес на уровне URL-адреса, а не групповой маршрут.
например: если есть два пути: /filter/test01
а также /filter/test02
и я хочу фильтровать только test01.
Есть ли хороший способ сделать это?
1 ответ
Решение
Вы можете добавить промежуточное программное обеспечение для этого:
func filterIP(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
// Block requests from localhost.
if c.RealIP() == "127.0.0.1" {
return echo.NewHTTPError(http.StatusUnauthorized,
fmt.Sprintf("IP address %s not allowed", c.RealIP()))
}
return next(c)
}
}
func main() {
e := echo.New()
e.Use(filterIP)
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.Logger.Fatal(e.Start(":1323"))
}
Важно использовать RealIP()
функция, в противном случае вы можете получить IP-адрес прокси.