在Go gin中实施IP限制

时间:2018-10-04 03:56:52

标签: go ip authorization go-gin

我正在设置一个小型演示应用程序,目前我只希望可以从我的家庭IP地址访问它,也许我会与一小部分技术人员进行协调和共享。

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

---什么是规范的最小示例,如何将对应用程序的访问限制为仅杜松子酒中的特定IP地址?

(还有什么理由在2018年这是一个特别不安全的主意?)

1 个答案:

答案 0 :(得分:2)

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

为回答您的问题,在查看杜松子酒godoc reference之后,我发现context struct包含一个ClientIp()方法,

  

实现了一种尽力而为的算法来返回真实的客户端IP,它解析X-Real-IP和X-Forwarded-For,以便与诸如nginx或haproxy的反向代理一起正常工作。在X-Real-Ip之前使用X-Forwarded-For,因为nginx在代理的IP上使用X-Real-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
}