有没有一种好的方法可以使用Echo按IP地址过滤请求?

时间:2019-04-24 12:09:28

标签: go go-echo

我正在使用Echo HTTP框架开发API服务器。我想按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"))
}

我想在url级别而不是组路由中过滤IP地址。
例如:如果有两条路径:/filter/test01/filter/test02,而我只想过滤test01。
有什么好办法吗?

1 个答案:

答案 0 :(得分: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地址。