Beego中“记住我”需配置持久化session后端并手动实现remember token机制:设cookieLifeTime控制有效期,用加密cookie存token,数据库存token与用户关联,通过中间件自动校验并刷新token。

Beego 中 session 默认不持久化,必须显式配置
Beego 的 session 模块默认使用内存存储,重启服务后所有 session 丢失,Remember Me 功能必然失效。要实现“记住登录状态”,第一步是切换 session 后端并启用 cookie 持久化参数。
关键配置在 conf/app.conf 中:
sessionon = true sessionprovider = "file" # 或 "redis"、"mysql" sessionname = "beegosessionID" sessiongcmaxlifetime = 3600 cookieLifeTime = 86400 # cookie 有效期(秒),对应“记住我”时长 cookieName = "beego_remember" # 建议与 sessionname 区分 secure = false # 生产环境应设为 true(需 HTTPS) enablesetcookie = true
-
cookieLifeTime是核心:它控制浏览器中 cookie 的过期时间,直接影响“记住登录”的持续时长;设为 0 表示会话级 cookie(关闭浏览器即失效) -
sessionprovider = "file"适合开发,但生产环境务必用"redis",否则多实例部署时 session 不共享 -
cookieName和sessionname分开设置,避免和框架默认 session ID 混淆,便于后续独立管理 remember token
手动写入 remember token 到数据库 + 加密 cookie
Beego 自带的 session 不区分“登录态”和“记住态”,所以不能只依赖 StartSession()。真实场景中,“记住我”需要生成长期有效的 token,存入数据库,并通过加密 cookie 安全传递。
典型做法:
- 用户勾选“记住我”后,生成随机
remember_token(如 32 字节 hex),连同user_id和过期时间(如 30 天)存入user_remember_tokens表 - 用
gorilla/securecookie或 Beego 内置的beego.BConfig.AppConfig.String("appkey")加密该 token,再写入 HTTP cookie:ctx.SetCookie("remember_token", encrypted, 2592000, "/", "", false, true) - 注意:不要把
user_id明文塞进 cookie,必须加密或签名,否则可被伪造
登录成功后调用 SetSession 并同步写 remember cookie
Beego 控制器中处理登录逻辑时,不能只做 ctx.SetSession("uid", userID),必须判断是否启用“记住我”:
if rememberMe {
// 1. 生成并保存 remember token 到 DB
token := util.RandString(32)
model.SaveRememberToken(userID, token, time.Now().AddDate(0,0,30))
// 2. 加密后写入 cookie(使用 Beego appkey)
encoded, _ := securecookie.Encode("remember", map[string]interface{}{"uid": userID, "t": token})
ctx.SetCookie("remember_token", encoded, 2592000, "/", "", false, true)
}
// 3. 正常设置 session(仍需,用于当前请求上下文)
ctx.SetSession("uid", userID)
-
SetSession和 remember cookie 是两套机制:前者管当前会话生命周期,后者管跨会话自动登录 - cookie 过期时间(如
2592000秒)应与数据库中 token 的expires_at一致,避免“cookie 没过期但 token 已失效”的状态错乱 -
ctx.SetCookie第 6 个参数是httpOnly,必须为true,防止 XSS 窃取 remember token
中间件中自动校验 remember cookie 并恢复 session
每次请求进来,需要检查是否存在有效的 remember_token cookie,若有效则自动登录并重建 session —— 这不能放在每个控制器里,应该用 Beego 的 InsertFilter 实现全局自动登录中间件。
示例逻辑:
func AutoLoginFilter(ctx *context.Context) {
cookie, err := ctx.Request.Cookie("remember_token")
if err != nil || cookie == nil { return }
// 解密 cookie 得到 map[string]interface{}
var data map[string]interface{}
if securecookie.Decode("remember", cookie.Value, &data) != nil { return }
uid, ok := data["uid"].(int64)
if !ok { return }
// 查询 DB 中 token 是否匹配且未过期
if model.ValidRememberToken(uid, data["t"].(string)) {
ctx.SetSession("uid", uid)
ctx.SetSession("remembered", true) // 可选标记
}
}
// 注册:beego.InsertFilter("/*", beego.BeeApp.Handlers, AutoLoginFilter)
- 解密失败、UID 类型断言失败、DB 查询无结果,都应静默跳过,不干扰正常流程
- 务必在
AutoLoginFilter中调用ctx.SetSession,否则后续控制器拿不到uid - 如果已存在有效 session(比如用户刚登录),这个中间件应直接跳过,避免重复操作 —— 可加
if ctx.GetSession("uid") == nil判断
最易忽略的是:remember token 一旦使用,应立即刷新(生成新 token 替换旧 token),否则存在重放风险。实际项目中,校验成功后要删旧 token、存新 token、重写 cookie —— 这步漏掉,就等于没安全可言。


















