From 5182fa86e709917a2a009e7e237ec5bc45cef22e Mon Sep 17 00:00:00 2001 From: zhangyudi Date: Fri, 8 May 2020 15:49:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E8=B0=83=E7=94=A8=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=9E=E8=AE=A1=E6=AC=A1=E5=85=A5=E5=BA=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handler/proxyhandler.go | 46 +++++++++++++++++++++++++------------ src/service/field.go | 29 ++++++++++++++--------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/handler/proxyhandler.go b/src/handler/proxyhandler.go index cb684a1..bfde950 100644 --- a/src/handler/proxyhandler.go +++ b/src/handler/proxyhandler.go @@ -17,58 +17,74 @@ var Resp *http.Response func Proxy(c *gin.Context) { appId := c.Param("appId") - // TODO 根据appId 获取真实地址 + proxyData, err := service.GetRealPath(appId) + if err != nil { c.Error(err) return } + f, _ := forward.New(forward.PassHostHeader(true), forward.ResponseModifier(func(resp *http.Response) error { Resp = resp - // 判断调用是否到达上限 + callflag, sensitiveflag, err := service.QueryCallsCount(appId, proxyData) + + if err != nil { + Return(err.Error()) + return nil + } + if callflag == false { Return(`调用达到当日限定次数`) return nil } respbody, _ := ioutil.ReadAll(resp.Body) - //筛选字段 - model := make(map[string]interface{}) - realData := make(map[string]interface{}) - json.Unmarshal([]byte(proxyData.ResFields), &model) - json.Unmarshal(respbody, &realData) - res := service.Change(model, realData) - if err != nil { - Return(err.Error()) - return nil + + var res interface{} + + res = respbody + + if proxyData.ResFields != "" { + res = service.FiledFilter(proxyData, respbody) } - // TODO 筛选过滤敏感字段 + if sensitiveflag == false { - Sensituve_word := make(map[string]interface{}) - json.Unmarshal([]byte(proxyData.Sensituve_word), &Sensituve_word) - res = service.FilterSensituveField(Sensituve_word, res) + res = service.SensitiveFilter(proxyData, res) } + Return(res) return nil })) + c.Request.URL = testutils.ParseURI(proxyData.RealUrl) + c.Request.RequestURI = proxyData.RealUrl + c.Request.Host = getHost(proxyData.RealUrl) + f.ServeHTTP(c.Writer, c.Request) + } func Return(res interface{}) { + var b []byte + switch res.(type) { case []byte: b = res.([]byte) case interface{}: b, _ = json.Marshal(res) } + Resp.Header.Set("X-Log-By", "Apaas") + l := strconv.Itoa(len(b)) + Resp.Header.Set("Content-Length", l) + Resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) } diff --git a/src/service/field.go b/src/service/field.go index a39a0a8..b188a59 100644 --- a/src/service/field.go +++ b/src/service/field.go @@ -8,6 +8,7 @@ package service import ( + "encoding/json" "errors" "fmt" "gitlab.wodcloud.com/apaas/apaas-meshproxy/src/client" @@ -54,7 +55,7 @@ func QueryCallsCount(applyId string, filter model.ProxyData) (call bool, sensiti return } //超过允许访问敏感字段次数 - if count+1 > filter.Sensitive_count { + if count+1 > filter.Sensitive_count && filter.Sensituve_word != "" { sensitiveCall = false } expire := GetExpire() @@ -76,6 +77,15 @@ func GetExpire() time.Duration { return subMin } +//过滤返回字段 +func FiledFilter(proxyData model.ProxyData, respbody []byte) interface{} { + model := make(map[string]interface{}) + realData := make(map[string]interface{}) + json.Unmarshal([]byte(proxyData.ResFields), &model) + json.Unmarshal(respbody, &realData) + return Change(model, realData) +} + //返回申请字段 func Change(model interface{}, returnData interface{}) interface{} { switch t := model.(type) { @@ -148,6 +158,13 @@ func UpdateCallsCount(applyId string) (err error) { return } +//返回过滤后的敏感字段 +func SensitiveFilter(proxyData model.ProxyData, res interface{}) interface{} { + Sensituve_word := make(map[string]interface{}) + json.Unmarshal([]byte(proxyData.Sensituve_word), &Sensituve_word) + return FilterSensituveField(Sensituve_word, res) +} + // 过滤敏感字段 func FilterSensituveField(model interface{}, returnData interface{}) (body interface{}) { switch t := model.(type) { @@ -165,11 +182,6 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter FilterSensituveField(v, v1) } } - // 删除属性 - //if !flag { - // fmt.Println("删除属性:", k) - // delete(returnData.(map[string]interface{}), k) - //} } break case []interface{}: @@ -189,11 +201,6 @@ func FilterSensituveField(model interface{}, returnData interface{}) (body inter FilterSensituveField(v1, v2) } } - // 删除属性 - //if !flag { - // fmt.Println("删除属性:", k) - // delete(v.(map[string]interface{}), k1) - //} } } break -- 2.26.0