我有一个应用程序,我需要限制为少数IP。如果请求IP不是来自允许列表,我可以写一个中间件并返回,但是我希望这个过程尽可能高效。即我想尽早放弃连接。我可以删除连接的最早阶段是什么,最好是使用HTTP响应。 我没有控制主机防火墙或边界防火墙来过滤流量,而且,即使我控制了防火墙,我也无法提供HTTP响应。
此外,如果我能在杜松子酒中获得HTTP请求生命周期的描述,我更愿意。
答案 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
}
}
}