下面是自定义filter,拦截所有/api作为前缀的路由,做安全校验的例子
1.自定api校验filter
package filters
import (
"errors"
"github.com/astaxie/beego/context"
"strings"
)
func AuthFilter(ctx *context.Context) {
// 获取请求头中的 Authorization 字段
auth := ctx.Input.Header("Authorization")
// 判断是否为空
if auth == "" {
ctx.Output.JSON(map[string]string{"code": "401", "msg": "Authorization is required."}, false, false)
return
}
// 判断 Authorization 字段格式是否正确
prefix := "Bearer "
if !strings.HasPrefix(auth, prefix) {
ctx.Output.JSON(map[string]string{"code": "401", "msg": "Authorization format is incorrect."}, false, false)
return
}
// 获取 token
token := strings.TrimPrefix(auth, prefix)
if token == "" {
ctx.Output.JSON(map[string]string{"code": "401", "msg": "Token is required."}, false, false)
return
}
// 判断 token 的合法性
if !isValidToken(token) {
ctx.Output.JSON(map[string]string{"code": "401", "msg": "Invalid token."}, false, false)
return
}
}
// 判断 token 是否合法
func isValidToken(token string) bool {
// 校验逻辑,这里可以自定义token校验逻辑,如果使用jwt,这里使用jwt进行校验
return true
}
2.注册自定义filter,拦截指定路由
package main
import (
"github.com/astaxie/beego"
"myapp/filters"
"myapp/controllers"
)
func init() {
// 注册filter, 拦截/api前缀的所有请求
beego.InsertFilter("/api/*", beego.BeforeRouter, filters.AuthFilter)
}