You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言Gin框架中集成使用gorilla/csrf中间件

Gin框架集成gorilla/csrf中间件的正确实现

核心问题说明

gorilla/csrf的Protect方法返回的是标准net/http库的中间件签名func(http.Handler) http.Handler,和Gin原生的gin.HandlerFunc中间件格式不兼容,因此不能直接通过g.Use()注册,需要做一层适配。官方标注的兼容是指可通过适配标准http中间件的方式接入,而非直接原生支持。

你当前实现的问题

你自定义的空helloWorldHandler属于无效逻辑:csrf中间件执行完成后只会运行该空Handler,不会进入Gin的后续路由处理链,仅仅是巧合下能生成token,实际请求校验、业务逻辑执行都会存在异常。

正确适配方案

将gorilla/csrf的中间件封装为Gin兼容的中间件格式,代码如下:

import (
    "net/http"
    "github.com/gin-gonic/gin"
    "github.com/gorilla/csrf"
)

func CSRFMiddleware(authKey []byte, opts ...csrf.Option) gin.HandlerFunc {
    // 初始化gorilla csrf保护逻辑
    csrfProtect := csrf.Protect(authKey, opts...)
    return func(c *gin.Context) {
        // 将Gin后续处理逻辑封装为标准http.Handler传给csrf中间件
        nextHandler := csrfProtect(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // 替换gin的Request,csrf中间件会将token存入Request的上下文
            c.Request = r
            // 执行Gin后续的中间件、路由处理逻辑
            c.Next()
        }))
        // 执行csrf校验逻辑
        nextHandler.ServeHTTP(c.Writer, c.Request)
        // 自定义csrf校验失败的返回格式
        if c.Writer.Status() == http.StatusForbidden {
            c.AbortWithStatusJSON(http.StatusForbidden, gin.H{
                "code": 403,
                "message": "CSRF校验不通过"
            })
        }
    }
}

完整使用示例

func main() {
    r := gin.Default()
    // 注册CSRF中间件,注意密钥必须为32字节长度,生产环境禁止硬编码
    r.Use(CSRFMiddleware([]byte("32-byte-long-auth-key-xxxxxxxxxxxx")))

    // GET请求可正常获取CSRF Token
    r.GET("/token", func(c *gin.Context) {
        token := csrf.Token(c.Request)
        // 可以将token放入响应头或者响应体返回给前端
        c.Header("X-CSRF-Token", token)
        c.JSON(http.StatusOK, gin.H{"csrf_token": token})
    })

    // POST/PUT/DELETE等非安全请求会自动校验CSRF Token
    r.POST("/submit", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "请求成功"})
    })

    r.Run(":8080")
}

注意事项

  • 加密密钥必须为32字节,对应AES-256加密强度,生产环境需要存储在安全配置中,不得硬编码在代码里
  • 默认校验规则:GET/HEAD/OPTIONS/TRACE这类安全方法不校验,POST/PUT/DELETE等方法会优先校验请求头的X-CSRF-Token,其次校验表单字段的gorilla.csrf.Token,可通过传入Option修改字段名、错误提示等配置
  • 前后端分离场景下,前端需要将获取到的CSRF Token放入请求头的X-CSRF-Token字段中随请求传递
  • 不需要校验CSRF的路由可以单独分组,不注册该中间件即可

内容的提问来源于stack exchange,提问作者Ignacio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:15:10