Beego 官方不内置图形验证码模块,v1.12+ 已移除 beego.Captcha;推荐使用轻量无依赖的 github.com/mojocn/base64Captcha,支持 base64 返回、兼容 Beego 2.x,需配合 session 存 ID、store 验证、及时删除 ID 以保障安全。

Beego 中集成验证码的常用方案
Beego 官方不内置图形验证码(CAPTCHA)模块,直接调用 beego.Captcha 会报错 —— 这个包早在 v1.12+ 就被移除了。实际项目里得靠第三方库补位,最稳定的是 github.com/mojocn/base64Captcha,它轻量、无依赖、支持 base64 返回,和 Beego 的 HTTP 处理逻辑天然契合。
别用 gopkg.in/asnar/captcha.v1 或老版本 github.com/astaxie/beego/utils/captcha:前者已归档且不兼容 Go mod,后者在 Beego 2.x 下无法注册路由或生成图像。
生成并返回 base64 验证码图片
核心是把验证码图像转成 base64 字符串,避免额外静态资源路径配置。关键点在于:不能直接写入 context.ResponseWriter,而要构造 JSON 响应体;同时必须设置 Content-Type: application/json,否则前端 fetch 会解析失败。
- 生成验证码 ID 和 base64 图片时,用
cpt.DriverDigit.Render()得到图像字节,再base64.StdEncoding.EncodeToString() - 把 ID 存进 Beego 的 session(如
ctx.Input.Session("captcha_id")),**不能存在内存 map 或全局变量**——多实例部署下会失效 - 响应结构建议固定为
{"id": "xxx", "img": "data:image/png;base64,..."},前端可直接赋给<img src="...">
// 示例 handler
func (c *MainController) GetCaptcha() {
driver := base64Captcha.NewDriverDigit(80, 24, 5, 0.7, 2)
cpt := base64Captcha.NewCaptcha(driver, base64Captcha.DefaultMemStore)
id, b64s, err := cpt.Generate()
if err != nil {
c.Data["json"] = map[string]string{"error": "gen failed"}
c.ServeJSON()
return
}
c.Ctx.Input.Session("captcha_id", id)
c.Data["json"] = map[string]interface{}{
"id": id,
"img": "data:image/png;base64," + b64s,
}
c.ServeJSON()
}验证用户提交的验证码值
验证动作必须和生成时使用同一个 store 实例(如 base64Captcha.DefaultMemStore),否则查不到记录。常见错误是每次验证都 new 一个新 Captcha 对象,导致 store 不一致。
- 从 session 取出
captcha_id,再用它去 store 查原始文本值 - 注意大小写:默认
DriverDigit生成的是纯数字,但若改用DriverString,需明确设置Lower或Upper,否则前端输小写、后端比大写会失败 - 验证成功后,**立刻调用
store.Remove(id)** —— 否则同一验证码可重复使用,有安全风险 - Beego 的
c.Ctx.Input.IP()不可用于限流绑定验证码(IP 可伪造),应结合 session 或登录态 userId
Beego 2.x 路由与中间件注意事项
在 Beego 2.x 中,如果用了 namespace 路由分组,验证码接口的 handler 必须显式注册,不能依赖 controller 自动扫描 —— 因为 base64Captcha 不走 Beego 的 render 流程,不会触发模板渲染逻辑。
- 确保路由匹配方法为 GET(获取图片)和 POST(提交校验),不要混用
Get()和Post()到同一个函数 - 若启用了 CSRF 中间件,
GetCaptcha接口必须加xsrf := false标记,否则首次请求会因缺少_xsrfcookie 被拦截 - 生产环境务必关闭
EnableAdmin和EnableDocs,避免/captcha类路径被文档工具误暴露
验证码的时效性、存储隔离、大小写敏感、ID 一次性使用,这四点漏掉任一,就等于没做验证。尤其多人共用一台测试服务器时,DefaultMemStore 的内存共享会让验证码互相干扰 —— 此时得换 Redis store,但 Beego 本身不提供封装,得自己包装 base64Captcha.Store 接口。


















