Beego中登录需手动在Controller方法内校验凭证,登录接口(如Login)跳过校验,仅比对密码并调用c.SetSession("uid", userID);其他接口开头须检查c.GetSession("uid")==nil,为真则重定向至/login?next=原路径,且登出需同时调用c.DelSession和c.DestroySession。

Beego 中如何用 beego.Controller 实现登录逻辑
Beego 没有内置的“认证中间件”概念,登录必须手动在 Controller 方法里校验用户凭证。不能依赖框架自动拦截未登录请求,得自己写判断逻辑。
常见错误是把登录校验写在 Prepare() 里但没区分接口类型——比如登录接口本身也进了校验,导致死循环重定向或 401。
- 登录接口(如
Login())应跳过身份检查,只做密码比对和 session 写入 - 其他需保护的接口(如
UserList())应在方法开头调用自定义校验函数,例如if !c.IsLogin() { c.Abort("401") } -
c.SetSession("uid", userID)是最简登录态存储方式;不要存明文密码或 token 到 session - Beego 默认 session 存在内存中,重启服务会丢失登录态;生产环境务必配置
session.provider = redis并设置session.expires = 3600
为什么 CheckAccount() 要用 bcrypt 而不是 == 比对密码
直接用 user.Password == inputPassword 是严重安全漏洞:密码明文存储、无防爆破、无盐值。Beego 不强制加密,但你必须自己处理。
bcrypt 是 Beego 生态最常用选择,因为 golang.org/x/crypto/bcrypt 稳定且被官方示例推荐。别用 sha256 或 md5 ——它们不可加盐、计算太快,容易被彩虹表或 GPU 暴力破解。
- 注册时用
bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)存哈希值到数据库 - 登录时用
bcrypt.CompareHashAndPassword(hash, []byte(input))校验,返回nil表示成功 - 注意:
CompareHashAndPassword对时间恒定,能防计时攻击;而==比对字符串会在第一个字节不同就返回,暴露匹配长度
如何让未登录用户访问 /admin 页面时跳转到 /login
Beego 的 Redirect() 本身不保存原始 URL,所以单纯 c.Redirect("/login", 302) 会导致登录后回不到原页面。必须手动传递 next 参数。
典型漏点是前端发 AJAX 请求时,302 跳转会失败(浏览器不自动带 Cookie 跨域重定向),结果卡在登录页,后台却已写入 session。
- 在受保护方法开头加:
if !c.IsLogin() { c.Redirect("/login?next="+url.QueryEscape(c.Ctx.Request.RequestURI), 302); return } - 登录成功后读取
c.GetString("next"),非空则重定向过去,否则跳首页 - AJAX 场景下不要依赖 302,改用 JSON 返回
{"code":401,"msg":"unauthorized"},前端统一处理跳转 - Beego 的
Router配置里,/login必须显式声明为公开路由,避免被全局过滤器拦截
Session 失效后,c.GetSession() 返回 nil 还是空字符串
Beego 的 c.GetSession("uid") 在 session 过期或不存在时返回 nil,不是空字符串也不是 0。直接用 == "" 判断会误判。
这个细节常被忽略,导致“明明登出还显示欢迎 XXX”,其实是 session 已失效但代码仍把 nil 当作有效值用了。
- 正确判断方式:
if uid := c.GetSession("uid"); uid == nil { /* 未登录 */ } - 如果存的是 int 类型 ID,要先断言:
if uid, ok := c.GetSession("uid").(int); !ok { ... } - 登出时务必调用
c.DelSession("uid")+c.DestroySession(),只删 key 不销毁 session 容器,旧 session ID 仍可能被复用
真正麻烦的不是写登录,而是 session 续期、多端互踢、记住我(remember me)cookie 的安全签名、以及 CSRF 防护——这些 Beego 都不打包提供,得一层层补。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











