如何在gin-gonic/gin中间件中实现高效的IP白名单

i_a*_*ess 1 middleware go go-gin

我有一个应用程序,需要将其限制为少数几个 IP。我可以编写一个中间件,如果请求 IP 不在允许列表中,则返回,但是我希望这个过程尽可能高效。即我想尽早断开连接。我最早可以在什么阶段断开连接,最好是通过 HTTP 响应。我无法控制主机防火墙或边界防火墙来过滤流量,并且即使我控制了防火墙,我也无法提供 HTTP 响应。

另外,我希望能够获得 gin 中 HTTP 请求生命周期的描述。

Jaz*_*Cat 5

按照 Lansana 的描述添加中间件。

尽早在链中声明它很重要。

r := gin.New()

whitelist := make(map[string]bool)
whitelist["127.0.0.1"] = true

r.Use(middleware.IPWhiteList(whitelist))
Run Code Online (Sandbox Code Playgroud)

我会像这样编写中间件,如果你不在白名单中,则返回一个适当的错误,在下面的代码片段中我将返回一个 JSON 错误。

package middleware

import (
    "log"
    "net/http"

    "github.com/gin-gonic/gin"
)

func IPWhiteList(whitelist map[string]bool) gin.HandlerFunc {
    return func(c *gin.Context) {
        if !whitelist[c.ClientIP()] {
            c.AbortWithStatusJSON(http.StatusForbidden, gin.H{
                "status":  http.StatusForbidden,
                "message": "Permission denied",
            })
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)