【Gin】中间件练习题

路由组中间件

题目描述

创建一个 /admin 路由组,给它单独加一个鉴权中间件,其他接口不受影响。

规则:

  • 请求头带 token: admin123 才允许访问
  • 否则返回 401 无权限

输出示例

无 token:

{"code":401,"msg":"无权限访问"}

有 token:

{"msg":"欢迎进入后台管理"}

实现代码

Go 复制代码
package main

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

// admin 路由组鉴权中间件
func AdminAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("token")
		if token != "admin123" {
			c.JSON(401, gin.H{
				"code": 401,
				"msg":  "无权限访问",
			})
			// 终止请求
			c.Abort()
			return
		}
		// 放行
		c.Next()
	}
}

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

	// 公共接口
	r.GET("/", func(c *gin.Context) {
		c.String(200, "公共页面")
	})

	// admin 路由组 + 中间件
	adminGroup := r.Group("/admin")
	adminGroup.Use(AdminAuthMiddleware())
	{
		adminGroup.GET("/dashboard", func(c *gin.Context) {
			c.JSON(200, gin.H{"msg": "欢迎进入后台管理"})
		})
	}

	r.Run(":8080")
}

全局中间件

题目描述

写一个中间件,拦截所有接口 ,请求头带必须携带 token 和 userId 两个参数,缺少任意一个直接返回错误。

输出示例

缺少参数:{"code":400,"msg":"缺少必传参数 token 或 userId"}

正常:接口正常返回

实现代码

Go 复制代码
package main

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

func CheckParamsMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("token")
		userId := c.GetHeader("userId")

		if token == "" || userId == "" {
			c.JSON(400, gin.H{
				"code": 400,
				"msg":  "缺少必传参数 token 或 userId",
			})
			c.Abort()
			return
		}
		c.Next()
	}
}

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

	r.GET("/user", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "获取用户信息成功"})
	})
	r.Run(":8080")
}

全局请求来源校验中间件

题目描述

编写全局中间件 ,所有接口统一校验,只允许本地 127.0.0.1 访问,其他 IP 直接拒绝访问。

输出示例

非法 IP:{"msg":"禁止外部访问"}

正常访问:接口正常响应

实现代码

Go 复制代码
package main

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

func LocalOnlyMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		ip := c.ClientIP()
		if ip != "127.0.0.1" {
			c.JSON(403, gin.H{"msg":"禁止外部访问"})
			c.Abort()
			return
		}
		c.Next()
	}
}

func main() {
	r := gin.Default()
	r.Use(LocalOnlyMiddleware()) // 全局生效

	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"访问成功"})
	})
	r.Run(":8080")
}

单个路由参数校验

题目描述

编写中间件,只给 /pay 接口使用,必须传递金额参数 money,且金额大于 0 才可访问,其他接口无限制。

输出示例

无参数 / 金额错误:

{"msg":"请传入合法金额"}

实现代码

Go 复制代码
package main

import (
	"strconv"
	"github.com/gin-gonic/gin"
)

func MoneyCheck() gin.HandlerFunc {
	return func(c *gin.Context) {
		moneyStr := c.Query("money")
		money,err := strconv.Atoi(moneyStr)
		if err != nil || money <= 0 {
			c.JSON(400, gin.H{"msg":"请传入合法金额"})
			c.Abort()
			return
		}
		c.Next()
	}
}

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

	r.GET("/info", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"商品信息"})
	})

	// 单个路由绑定专属中间件
	r.GET("/pay", MoneyCheck(), func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"发起支付成功"})
	})

	r.Run(":8080")
}
相关推荐
ly76893 天前
PostgreSQL JSONB 在 Spring Boot 中的读写边界:从 JDBC 类型映射到 GIN 索引失效
spring boot·postgresql·gin·jsonb·pgjdbc·gin 索引
谢亮_vipxieliang7 天前
Go Gin 中间件与参数验证:从入门到实战
中间件·golang·gin
墨鱼老师15 天前
Go+Gin+Vue 毕设项目:Gin 框架搭建后端基础接口实战
vue.js·golang·go·gin·前后端分离·计算机毕业设计·go 后端
ttwuai17 天前
Golang Web后台管理框架推荐:Gin、GoFrame与数据面板项目怎么分
前端·golang·gin
EatFan17 天前
Go语言全栈实战:基于 Gin + Vue + JWT + RBAC 从零搭建前后端分离权限管理系统
vue.js·golang·go·vue·gin·jwt·rbac
数据库百宝箱18 天前
rum&gin索引对比
java·数据库·gin
ttwuai1 个月前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin
福兮说1 个月前
Gin 项目里的错误处理:让 Controller 不必知道错误是怎么来的
后端·go·gin·架构设计