首页 > 其他分享 >Gin框架配置ip地址白名单教程

Gin框架配置ip地址白名单教程

时间:2024-12-26 16:35:15浏览次数:3  
标签:ip 中间件 Gin func IP 白名单 gin

在 Gin 框架中实现 IP 白名单,可以通过中间件的方式检查客户端的 IP 地址是否在白名单中。如果不在白名单中,返回拒绝访问的响应。以下是实现教程:


实现步骤

  1. 定义 IP 白名单
    创建一个列表存储允许访问的 IP 地址。

  2. 编写中间件
    创建一个 Gin 中间件,用于拦截请求并检查客户端 IP 是否在白名单中。

  3. 应用中间件
    在路由中注册中间件,使其作用于需要限制的路由。


示例代码

package main

import (
	"net/http"
	"strings"

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

// 定义 IP 白名单
var whitelist = []string{
	"127.0.0.1",    // 本地 IP
	"192.168.1.100", // 示例局域网 IP
}

// 检查 IP 是否在白名单中
func isAllowedIP(clientIP string) bool {
	for _, ip := range whitelist {
		if clientIP == ip {
			return true
		}
	}
	return false
}

// IP 白名单中间件
func IPWhitelistMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		clientIP := c.ClientIP() // 获取客户端 IP 地址
		if !isAllowedIP(clientIP) {
			c.JSON(http.StatusForbidden, gin.H{
				"message": "Forbidden: Your IP is not allowed",
			})
			c.Abort() // 中止请求
			return
		}
		c.Next() // 继续处理请求
	}
}

func main() {
	r := gin.Default()

	// 使用 IP 白名单中间件
	r.Use(IPWhitelistMiddleware())

	// 定义测试路由
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	r.Run(":8080") // 启动服务
}

测试步骤

  1. 启动服务
    启动服务,监听 8080 端口。

  2. 访问接口

    • 使用允许的 IP(如本地 127.0.0.1)访问 http://localhost:8080/ping
      响应:
      {
        "message": "pong"
      }
      
    • 使用不在白名单的 IP 访问,返回:
      {
        "message": "Forbidden: Your IP is not allowed"
      }
      

说明

  1. 动态配置白名单
    如果白名单需要动态配置,可以将其存储在配置文件或数据库中,并定期刷新到内存中。

  2. 支持 CIDR 格式
    如果需要支持 IP 段,可以使用第三方库,如 github.com/yl2chen/cidranger 来检查 IP 是否属于某个段。

  3. 多层代理支持
    如果服务部署在反向代理之后,获取客户端真实 IP 时需要使用 X-Forwarded-ForX-Real-IP,Gin 的 c.ClientIP() 方法会自动处理这些头部信息。

  4. 安全性注意
    IP 白名单适合简单的安全需求,但对于更复杂的场景(如高并发或分布式),推荐结合认证和权限系统。

标签:ip,中间件,Gin,func,IP,白名单,gin
From: https://www.cnblogs.com/freps/p/18633362

相关文章

  • 『NOIP2024』游记
    Day0在本校考,上午在刷板子,下午由于布置考场把我们都赶出去了,没事干只能和其他队友打篮球(没有进一个),晚上大概就是换了个小机房调整了一下就回家睡觉了,好像是\(23:00\)睡的。Day1早上\(7:30\)起的,感觉不是很清醒,遂骑车吹风来到学校。到门口发现进不去,找到了几个队友聊天,顺......
  • Nginx 学习
    Nginx主要功能:Web服务器:Nginx可以作为Web服务器,接收客户端的HTTP请求,根据配置文件中的规则返回相应的网页内容反向代理:Nginx可以作为反向代理服务器,位于后端服务器(如应用服务器、数据库服务器等)之前,接收来自客户端的请求,然后将请求转发给后端服务器处理。负载均衡:Nginx......
  • 赛诸葛数字化智能中台系统login接口SQL注入漏洞复现 [附POC]
    文章目录赛诸葛数字化智能中台系统login接口SQL注入漏洞复现[附POC]0x01前言0x02漏洞描述0x03影响版本0x04漏洞环境0x05漏洞复现1.访问漏洞环境2.构造POC3.复现赛诸葛数字化智能中台系统login接口SQL注入漏洞复现[附POC]0x01前言免责声明......
  • 想到了个童年小游戏,2个人4只手就能玩,简单用JavaScript实现一下
    /** *规则:双方各有左右2个数,初始值为1。每回合,可以将自身的一个数与对方的一个数相加,然后模10。 *如,第一回合你操作:你(11)机器人(11)-->你(12)机器人(11) *下回合机器人操作:你(12)机器人(11)-->你(12)机器人(13) *第三回合你操作:你(12)机器人(13)-->你(15)机器人(13) *......
  • DataGrip2024.3完整版的安装教程(附激活,常见问题处理)
    卸载老版本DataGrip首先,如果小伙伴的电脑上有安装老版本的DataGrip,需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可):TIP:如果你之前使用过本站提供的 激活到2025年版本脚本,需要执行对应卸载脚本/适用2024版本/JetBrains2023最新全家桶/jetbra/scripts/unin......
  • Eclipse Jgit 不支持高版本 openssh 私钥的结局方法 (jsch 报错 invalid privatekey
    替换jsch依赖<dependency><groupId>org.eclipse.jgit</groupId><artifactId>org.eclipse.jgit.ssh.jsch</artifactId><version>7.1.0.202411261347-r</version><ex......
  • Multipartfile文件上传
    1.MultipartfileMultipartFile是SpringMVC提供简化上传操作的工具类2.环境搭建3.目录创建在main目录下新建webapp目录,然后在webapp目录下新建WEB-INF目录WEB-INF目录下新建JSP目录JSP下新建index.jspindex.jsp内容<%@pagelanguage="java"contentType="text/htm......
  • Nginx使用手册
    由于格式和图片解析问题,为了更好的体验可前往阅读原文Nginx(发音为"engine-x")是一个高性能、开源的HTTP和反向代理服务器,也可以作为电子邮件(IMAP/POP3)代理服务器、以及通用的TCP/UDP代理服务器。它由俄罗斯的程序员IgorSysoev创建于2002年,其目的是解决C10K问题(即可以同时处理......
  • Tippy.js-纯js tooltip工具提示插件
    Tippy.js是一款轻量级的纯jstooltip工具提示插件。该tooltip插件功能强大,提供多种动画效果和主题效果,并允许用户自定义tooltip主题和使用html代码作为tooltip的模板。    在线预览  下载 使用方法在页面中引入tippy.js和tippy.css文件。<......
  • 【Unity 图标资源包】RPG Engineering Skill Icons 专为角色扮演游戏(RPG)开发者设计的
    RPGEngineeringSkillIcons是一款专为角色扮演游戏(RPG)开发者设计的图标资源包,旨在为游戏中的工程技能和工艺系统提供高质量的图标。这些图标特别适用于RPG游戏中的技能树、任务栏、物品制作系统等,帮助开发者清晰地展示各种与工程和工艺相关的技能和操作。无论是打造武器......