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

时间:2018-04-02 17:46:38

标签: go middleware gin

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

此外,如果我能在杜松子酒中获得HTTP请求生命周期的描述,我更愿意。

2 个答案:

答案 0 :(得分:1)

您是否阅读过Gin documentation

您可以根据this section中的示例添加中间件。使用<link rel="stylesheet" href="https://openlayers.org/en/v4.6.5/css/ol.css" type="text/css"> <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> <script src="https://openlayers.org/en/v4.6.5/build/ol.js"></script> <div id="map" class="map"></div>链接中间件。如果您希望它尽可能高效,请将其作为链中的第一个中间件,并使用允许O(1)读取访问权限的数据结构。

例如:

router.Use()

var myWhiteList map[string]bool = map[string]bool{ "1.2.3.4": true, "4.3.2.1": true, } func main() { // Creates a router without any middleware by default r := gin.New() // Add whitelist middleware r.Use(middleware.IPWhitelist(myWhiteList)) // Listen and serve on 0.0.0.0:8080 r.Run(":8080") } 的实现可能如下所示:

middleware.IPWhitelist

答案 1 :(得分:1)

添加Lansana描述的中间件。

尽可能早地在链中声明它是很重要的。

r := gin.New()

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

r.Use(middleware.IPWhiteList(whitelist))

我会像这样编写中间件,如果你不在白名单中,则返回一个合适的错误,在下面的代码片段中我返回了一个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
        }
    }
}