在 Go gin 中实现 IP 限制

Mit*_*ops 1 ip authorization go go-gin

我正在设置一个小型演示应用程序,我希望现在只能从我的家庭 IP 地址访问,也许我将与一小组技术人员进行协调和分享。

我在这里查看了自述文件,但找不到:https : //github.com/gin-gonic/gin

---关于如何将应用程序的访问限制为 gin 中的特定 IP 地址的规范的、最小的示例是什么?

(另外,有什么理由认为这是 2018 年特别不安全的想法?)

H. *_*oss 5

在我回答您的问题之前,我想说使用防火墙规则而不是程序本身来限制对应用程序的访问可能更实用,但我离题了。

为了回答您的问题,在查看了 gin godoc 参考之后,我发现上下文结构包含一个ClientIp()方法:

实现了一种尽力而为的算法来返回真实的客户端 IP,它解析 X-Real-IP 和 X-Forwarded-For 以便与我们这样的反向代理正常工作:nginx 或 haproxy。在 X-Real-Ip 之前使用 X-Forwarded-For,因为 nginx 使用 X-Real-Ip 和代理的 IP。

因此,如果您设置在应用程序中进行 IP 过滤,则可以根据该方法返回的值进行过滤。

使用 Github 页面上给出的基本示例:

package main

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

var Whitelist []string = []string{"1.2.3.4"}

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        whitelisted := false
        for _, v := range Whitelist {
            if v == c.ClientIP() {
                whitelisted = true
            }
        }
        if whitelisted {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        } else {
            c.JSON(403, gin.H{})
        }
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}
Run Code Online (Sandbox Code Playgroud)

  • 关于防火墙的提示是完全正确的,完全是废话,而且完全有帮助。感谢您以及针对特定应用程序的出色答案。 (2认同)