路由组中间件
题目描述
创建一个
/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")
}