소스 검색

wip:赛思注入用户身份

wangkaiyue 2 년 전
부모
커밋
ea087cdf14
5개의 변경된 파일53개의 추가작업 그리고 8개의 파일을 삭제
  1. 10 0
      core/proxy/broker/broker.go
  2. 22 0
      core/proxy/broker/outServer/SussBi.go
  3. 9 0
      core/proxy/middleware/filterFuncs.go
  4. 7 8
      core/proxy/proxyServer.go
  5. 5 0
      core/proxy/vars/vars.go

+ 10 - 0
core/proxy/broker/broker.go

@@ -30,6 +30,7 @@ type OutServerInterface interface {
 	AutoLogin() error                    //自动登录
 	RequestLogin(r *ghttp.Request) error //身份状态
 	CheckLoginOut(r *ghttp.Request) bool //状态是否过期
+	Filter(r *ghttp.Request) error       //过滤器
 }
 
 // AddNode 发现注册新节点
@@ -117,3 +118,12 @@ func (b *broker) OutSeverLoginIn(address string) error {
 	}
 	return server.AutoLogin()
 }
+
+// OutSeverFilter 外部程序过滤器
+func (b *broker) OutSeverFilter(address string, r *ghttp.Request) error {
+	server, ok := b.outServer[address]
+	if !ok {
+		return fmt.Errorf("未知外部服务")
+	}
+	return server.Filter(r)
+}

+ 22 - 0
core/proxy/broker/outServer/SussBi.go

@@ -1,9 +1,14 @@
 package outServer
 
 import (
+	"bp.jydev.jianyu360.cn/BaseService/gateway/core/router"
+	"bytes"
 	"fmt"
 	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/util/gconv"
 	"golang.org/x/net/publicsuffix"
+	"io"
+	"io/ioutil"
 	"net/http"
 	"net/http/cookiejar"
 	"net/url"
@@ -61,3 +66,20 @@ func (s *sussBi) CheckLoginOut(r *ghttp.Request) bool {
 	}
 	return false
 }
+
+func (s *sussBi) Filter(r *ghttp.Request) error {
+	ctx := router.GetGContext(r.GetCtx())
+	if ctx.Sess.NewUid != 0 && r.Request.Method == http.MethodPost {
+		bodyBytes, err := io.ReadAll(r.Request.Body)
+		if err != nil {
+			return err
+		}
+		finalBytes := bytes.ReplaceAll(bodyBytes, []byte(`"jyUserId"`), []byte(fmt.Sprintf(`"%d"`, ctx.Sess.NewUid)))
+		r.ContentLength = gconv.Int64(len(finalBytes))
+		r.Request.Header.Set("Content-Length", fmt.Sprintf("%d", len(finalBytes)))
+		//fmt.Printf("before len:%d value:%s\nafter: len:%d value:%s\n", len(bodyBytes), string(bodyBytes), len(finalBytes), string(finalBytes))
+		//fmt.Printf("header %+v\n", r.Request.Header)
+		r.Request.Body = ioutil.NopCloser(bytes.NewReader(finalBytes))
+	}
+	return nil
+}

+ 9 - 0
core/proxy/middleware/filterFuncs.go

@@ -1,6 +1,7 @@
 package middleware
 
 import (
+	"bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/vars"
 	"fmt"
 	"strings"
 
@@ -56,6 +57,14 @@ func filterBefore(r *ghttp.Request) error {
 	//注入用户身份
 	infusionIdentity(r, ctx.Sess, useCount, surplusCount, rule.AppId)
 
+	//外部程序过滤器
+	if rule.IsOutServer {
+		//赛思用户身份注入
+		if err := vars.BManager.OutSeverFilter(rule.MiddleCode, r); err != nil {
+			return err
+		}
+	}
+
 	return nil
 }
 

+ 7 - 8
core/proxy/proxyServer.go

@@ -7,6 +7,7 @@ import (
 	"bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/broker/outServer"
 	"bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/middleware"
 	"bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/proxyClient"
+	"bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/vars"
 	"bp.jydev.jianyu360.cn/BaseService/gateway/core/router"
 	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
@@ -17,7 +18,6 @@ import (
 	"net/url"
 )
 
-var bManager = broker.InitBroker()
 var routerManager *router.Manager
 
 const errTryTime = 10 //错误尝试
@@ -27,7 +27,7 @@ func InitGateWayServer() *ghttp.Server {
 	initCtx := gctx.New()
 	//创建节点,并持续观察节点变化
 	watchNode := node.NewNode(gcfg.Instance().MustGet(initCtx, "system.etcdListen", nil).Strings()...)
-	go watchNode.NewWatcher(initCtx, bManager)
+	go watchNode.NewWatcher(initCtx, vars.BManager)
 
 	//初始化可访问路由
 	var err error
@@ -39,7 +39,7 @@ func InitGateWayServer() *ghttp.Server {
 	sussBiServer := outServer.InitSussBi(gcfg.Instance().MustGet(initCtx, "outServer.sussbi.addr", nil).String(),
 		gcfg.Instance().MustGet(initCtx, "outServer.sussbi.user", nil).String(),
 		gcfg.Instance().MustGet(initCtx, "outServer.sussbi.password", nil).String())
-	bManager.RegisterOutServer(sussBiServer.Url, sussBiServer)
+	vars.BManager.RegisterOutServer(sussBiServer.Url, sussBiServer)
 
 	gateWayServer := g.Server()
 	//关闭系统自带请求日志
@@ -78,11 +78,11 @@ var proxyHandler = func(r *ghttp.Request) {
 		var changeFunc func(resp *http.Response) error
 		if gCtx.RouterRule.IsOutServer {
 			//外部服务直接获取
-			proxyAddr, err = bManager.GetOutSeverAutoLogin(gCtx.RouterRule.MiddleCode, r)
+			proxyAddr, err = vars.BManager.GetOutSeverAutoLogin(gCtx.RouterRule.MiddleCode, r)
 			changeFunc = broker.UnLoginSetErr //当未登录时,通过处罚异常尝试重新加载
 		} else {
 			// 从etcd注册的地址,根据负载规则获取服务地址
-			proxyAddr, err = bManager.GetServerAddr(gCtx.RouterRule.MiddleCode, r.GetClientIp())
+			proxyAddr, err = vars.BManager.GetServerAddr(gCtx.RouterRule.MiddleCode, r.GetClientIp())
 		}
 		if err != nil {
 			r.SetError(err)
@@ -104,13 +104,12 @@ var proxyHandler = func(r *ghttp.Request) {
 			}
 			g.Log().Error(r.Context(), "ErrorHandler ", err)
 		}
-
 		// 代理请求
 		proxyClient.CreateCustomProxyClient(proxyAddr, errHandel, changeFunc).ServeHTTP(r.Response.ResponseWriter, r.Request)
 
 		if gCtx.RouterRule.IsOutServer { //检测外部服务登录状态是否过期
-			if bManager.CheckOutSeverLoginOut(gCtx.RouterRule.MiddleCode, r) || hasErr {
-				if err := bManager.OutSeverLoginIn(gCtx.RouterRule.MiddleCode); err != nil {
+			if vars.BManager.CheckOutSeverLoginOut(gCtx.RouterRule.MiddleCode, r) || hasErr {
+				if err := vars.BManager.OutSeverLoginIn(gCtx.RouterRule.MiddleCode); err != nil {
 					g.Log().Errorf(r.GetCtx(), "%s 外部服务自动登录异常 %v \n", gCtx.RouterRule.MiddleCode, err)
 				}
 			}

+ 5 - 0
core/proxy/vars/vars.go

@@ -0,0 +1,5 @@
+package vars
+
+import "bp.jydev.jianyu360.cn/BaseService/gateway/core/proxy/broker"
+
+var BManager = broker.InitBroker()