beego中前置校验必须注册在beego.beforeexec阶段,才能安全读取session和路由参数;登录态校验需排除白名单路径,角色判断要显式类型断言,restful方法校验应使用ctx.input.method()。

在Beego中对用户登录状态、权限或请求参数做统一前置校验,必须选对过滤器执行时机,否则 session 无法读取、路由参数拿不到、静态资源被绕过。
确认过滤器执行位置
Beego 请求生命周期中,只有 BeforeExec 及之后阶段才能安全使用 ctx.Input.Session()。BeforeRouter 阶段 session 尚未初始化,强行调用会返回 nil;BeforeStatic 虽能拦截静态路径,但不适用于通用业务接口校验。
因此,绝大多数前置校验(如登录态、角色判断)应注册在 beego.BeforeExec 位置。
编写基础登录态校验过滤器
方法一:直接内联函数注册
在 main.go 的 beego.Run() 上方插入:
beego.InsertFilter("/*", beego.BeforeExec, func(ctx *context.Context) {<br> if _, ok := ctx.Input.Session("uid").(int); !ok {<br> ctx.Abort(401, "Unauthorized")<br> }<br>})
这一步操作起来很简单,直接把校验逻辑写进匿名函数里,适合快速验证。但注意:它会对所有路径生效,包括 /login、/register 等免校验接口,需手动排除。
按路由模式精准匹配校验范围
第一步:定义免校验白名单路径
在过滤器函数开头加判断,跳过登录、注册、验证码等公开接口:
path := ctx.Request.URL.Path<br>if strings.HasPrefix(path, "/login") || strings.HasPrefix(path, "/api/public/") {<br> return // 不拦截,放行<br>}
第二步:提取并校验用户角色
从 session 中取出 uid 后,查数据库或缓存获取角色信息。若角色字段为 "role",则:
role, ok := ctx.Input.Session("role").(string)<br>if !ok || role != "admin" {<br> ctx.Abort(403, "Forbidden")<br> return<br>}
⚠️ 注意:session 值类型断言失败时,ok 为 false,必须显式判断,否则 panic。
第三步:绑定到具体路由前缀
将过滤器只作用于需要保护的路径,例如仅校验 /api/v1/admin/ 下的所有请求:
beego.InsertFilter("/api/v1/admin/*", beego.BeforeExec, adminAuthFilter)
处理 RESTful 伪造请求的兼容校验
方法一:先还原真实 HTTP 方法再校验
前端常通过 _method=DELETE 提交表单。若校验逻辑依赖请求方法(如只允许 GET 查数据、POST 写数据),需在过滤器中提前还原:
realMethod := ctx.Input.Query("_method")<br>if realMethod != "" && ctx.Input.IsPost() {<br> ctx.Request.Method = realMethod<br>}
方法二:统一用 ctx.Input.Method() 获取最终方法
Beego 的 ctx.Input.Method() 已自动处理 _method 伪造逻辑,**无需手动还原即可直接使用**。校验时写 if ctx.Input.Method() == "DELETE" 即可,更简洁可靠。











