一架梯子,一头程序猿,仰望星空!
Beego 框架面试题 > 内容正文

beego 怎么通过自定义filter做api安全校验?


问题简答

beego 可以通过自定义 filter 实现 API 安全校验。可以在 filter 中获取请求中的 token,然后判断 token 的合法性,如果合法则继续请求,如果不合法则返回错误信息。

问题详解:

下面是自定义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)
}