我这里实现的是一个简单的认证方式:使用的固定token
本次主要想记录的技术点是
- 获取用户的请求参数和请求头并在路由转发前先做权限校验
- 通过结构体构建嵌套json
服务端
首先在路由的初始化函数中
- 定义权限认证函数
- 对接口url路由转发前进行权限认证
- 从请求头中获取用户名并注册到ctx中,后端可以通过ctx获取已注册的变量
router.go
package routers
import (
"go-common-lib/olog"
"kafka/routers/api"
"kafka/routers/ui"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
)
// 认证通过api调用的请求用户是否有token
var ApiAuthFilter = func(ctx *context.Context) {
if ctx.Request.RequestURI != "/auth-center/ui/auth/login" && ctx.Request.RequestURI != "/ui/platform/auth/login" {
olog.Debug("start auth request")
token := ctx.Request.Header.Get("Authorization")
if token == "xxx" {
username := ctx.Request.Header.Get("userName")
// userId := ctx.Request.Header.Get("userId")
olog.Debug("request is ok ,username is ", username)
// if username != "" && userId != "" {
if username != "" {
ctx.Input.SetData("username", username)
// ctx.Input.SetData("userID", userId)
} else {
olog.Debug("username or userId is not validate")
ctx.Redirect(401, "/401")
}
} else {
olog.Debug("request token is not exists")
ctx.Redirect(401, "/401")
}
}
}
func init() {
//对用户提供的接口
beego.InsertFilter("/kafka/api/v/*", beego.BeforeRouter, ApiAuthFilter)
api2Ns := beego.NewNamespace("/kafka/api/v",
api.DemandNs(),
)
beego.AddNamespace(api2Ns)
}
客户端请求
package main
import (
"bytes" "encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
var urlBase = "http://localhost:8888"
func WhiteListApply() {
//集群变更表单信息
type ProduceWhitelistItem struct {
User string `json:"user"`
Topic string `json:"topic"`
Bns string `json:"bns"`
}
type ConsumeWhitelistItem struct {
User string `json:"user"`
Topic string `json:"topic"`
Group string `json:"group"`
Bns string `json:"bns"`
}
type WhitelistFormInfo struct {
DepartmentId int `json:"departmentID"`
DepartmentName string `json:"departmentName"`
ClusterName string `valid:"Required" json:"clusterName" description:"集群名称"`
CausesAndNeeds string `valid:"Required" json:"causesAndNeeds" description:"申请原因及需求说明"`
Approver string `json:"approver"`
ProWhitelistType string `json:"proWhitelistType" description:"生产者白名单类型,bbb或ip"`
ConsumeWhitelistType string `json:"consumeWhitelistType" description:"消费者白名单类型,bbb或ip"`
ProduceWhitelist []ProduceWhitelistItem `json:"produceData" description:"生产者白名单新增"`
ConsumeWhitelist []ConsumeWhitelistItem `json:"consumeData" description:"消费者白名单新增"`
}
var url = fmt.Sprintf("%s/kafka/api/v/demand/whiteListApply", urlBase)
pro := make([]ProduceWhitelistItem, 2)
pro[0] = ProduceWhitelistItem{"user1", "topic1", "*"}
pro[1] = ProduceWhitelistItem{"user2", "topic2", "*"}
args := &WhitelistFormInfo{
DepartmentId: 000,
DepartmentName: "xxxx",
ClusterName: "demo_1",
CausesAndNeeds: "test",
ProWhitelistType: "IP",
ConsumeWhitelistType: "bbb",
ProduceWhitelist: pro,
ConsumeWhitelist: []ConsumeWhitelistItem{},
}
reqBody, err := json.Marshal(args)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqBody))
if err != nil {
panic(err)
}
req.Header.Set("userName", "xxx")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "xxx")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println("Response status:", resp.Status)
fmt.Println("body:", string(body))
}
func main() {
WhiteListApply()
}