Beego 过滤器 InsertFilter 实现请求拦截 验证Token Http中间件

在我们做Web开发中鉴权是少不了的一步。
如何在Beego中去实现一个Http中间件?

定义一个InsertFilter 在回到函数中去实现业务就好了。
最后记得在一个合适的地方去启动它比如main.go

核心代码

package http

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/context"
    "net/url"
    "ssuui-logger/common/auth"
    _"ssuui-logger/common/auth"
    "ssuui-logger/common/enum"
    "ssuui-logger/common/returnMessage"
    "ssuui-logger/common/tool"
    "ssuui-logger/service/v1"
)

func init() {
    var filterLogin = func(ctx *context.Context) {
        // 需要被过滤的地址 一定要写键值
        filter_map := map[string]string{
            "/v1/admin/login":"登录",
        }
        urlStr := ""
        tmpUrl ,err := url.Parse(ctx.Request.RequestURI)
        if err == nil {
            urlStr = tmpUrl.Path
        }
        if res := filter_map[urlStr] ;  res == "" {
            /** 不在 Map 内对请求进行处理 **/
            // 待验证数据
            waitingValidate := make([]string,1,1)
            // headerToken
            headerToken := ctx.Request.Header.Get("Token")
            waitingValidate = append(waitingValidate,headerToken)
            // paramToken
            serviceInstance := service.BaseService{
                Ctx:ctx,
            }
            paramToken := (serviceInstance.GetData())["token"]
            val , ok := paramToken.(string)
            if ok {
                // 断言成功 如果真的是字符串 加入到等待判断列表
                waitingValidate = append(waitingValidate,val)
            }
            // 循环验证多处token是否有效
            var successTokenContent *map[string]interface{}
            var authToken auth.Token
            for _ ,val := range waitingValidate {
                if val != "" {
                    authToken.Token = val
                    item , ok := authToken.ValidateToken()
                    if ok {
                        successTokenContent = item
                    }
                }
            }
            // 如果循环全部结果都都没有通过验证的直接返回登录失效
            if successTokenContent == nil {
                // 创建返回对象
                tmpErrInfo := map[string]interface{}{
                    "desc-en":"TokenValidateError",
                    "desc-zh":"Token验证失败",
                }
                ret := returnMessage.NewRetJson().
                    SetCode(enum.HttpCodeError).
                    SetMsg(enum.GetHttpCodeText(enum.HttpCodeFailure)).
                    SetData(tmpErrInfo)
                ctxPtr := tool.CtxPtr{
                    Ctx:ctx,
                }
                ctxPtr.QuickRetJson(ret)
                return
            }
            // 如果验证通过 这里再调用一下续签
            authToken.Token = (*successTokenContent)["token"].(string)
            authToken.RenewToken()
            ctx.Input.SetData("tokenData",successTokenContent)
        }
    }
    beego.InsertFilter("/v1/admin/*",beego.BeforeRouter,filterLogin)
}