Есть ли хороший способ фильтровать запросы по IP-адресу с помощью Echo?

Я разрабатываю сервер API с инфраструктурой Echo HTTP. Я хотел бы фильтровать некоторые запросы по 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.
Есть ли хороший способ сделать это?

Что такое "эхо кадр"? Если у вас есть какой-то сервер, вы должны иметь некоторый доступ к удаленному IP-адресу.

JimB 24.04.2019 14:12

это go-echo. Я могу получить удаленный IP-адрес, и я хочу сделать отдельный модуль фильтрации IP-адресов вместо кодирования в кодах логики службы. Есть ли хорошее промежуточное программное обеспечение для фильтрации IP-адресов?

Shaco 24.04.2019 14:24

Пожалуйста, покажите пример того, что вы пытаетесь сделать, желательно с минимальный воспроизводимый пример, если вы столкнулись с проблемой. Фреймворк Echo разработан для создания промежуточного программного обеспечения, поэтому может показаться, что у вас уже есть то, что вы ищете.

JimB 24.04.2019 14:30
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
3
1 976
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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-адрес прокси.

Другие вопросы по теме