package utils import ( "context" "net/url" "strconv" "github.com/mssola/user_agent" "google.golang.org/grpc/metadata" ) type UserInfo struct { ID int64 Name string RawUID string Refresh string ClientIP string // 客户端ip UserAgent string // 完整原始ua BrowserName string // 浏览器名称 BrowserVer string // 浏览器版本 StoreName string // 店铺名称 StoreId int64 // 店铺id SaleName string // 销售名称 SaleId int64 // 销售id GroupId int64 // 分组ID Valid bool } func GetUserFromCtx(ctx context.Context) UserInfo { md, ok := metadata.FromIncomingContext(ctx) if !ok { return UserInfo{Valid: false} } uidList := md.Get("x-user-id") nameList := md.Get("x-user-name") refreshList := md.Get("x-refresh") ipList := md.Get("x-client-ip") userAgentList := md.Get("x-user-agent") storeName := md.Get("x-store-name") storeId := md.Get("x-store-id") saleName := md.Get("x-sale-name") saleId := md.Get("x-sale-id") groupId := md.Get("x-group-id") if len(refreshList) == NumberZero { refreshList = md.Get("X-Refresh") } var userInfo UserInfo if len(uidList) > NumberZero { userInfo.RawUID = uidList[NumberZero] } if len(nameList) > NumberZero { userInfo.Name = nameList[NumberZero] } if len(storeName) > NumberZero { userInfo.StoreName = storeName[NumberZero] } if len(storeId) > NumberZero { userInfo.StoreId, _ = strconv.ParseInt(storeId[NumberZero], NumberTen, NumberSixtyFourth) } if len(saleName) > NumberZero { userInfo.SaleName = saleName[NumberZero] } if len(saleId) > NumberZero { userInfo.SaleId, _ = strconv.ParseInt(saleId[NumberZero], NumberTen, NumberSixtyFourth) } if len(groupId) > NumberZero { userInfo.GroupId, _ = strconv.ParseInt(groupId[NumberZero], NumberTen, NumberSixtyFourth) } if len(refreshList) > NumberZero { userInfo.Refresh = refreshList[NumberZero] } if len(ipList) > NumberZero { userInfo.ClientIP = ipList[NumberZero] } if len(userAgentList) > NumberZero { userInfo.UserAgent = userAgentList[NumberZero] userInfo.UserAgent, _ = url.QueryUnescape(userInfo.UserAgent) ua := user_agent.New(userInfo.UserAgent) userInfo.BrowserName, userInfo.BrowserVer = ua.Browser() } userInfo.Valid = false if userInfo.RawUID == StringEmpty { return userInfo } uid, err := strconv.ParseInt(userInfo.RawUID, NumberTen, NumberSixtyFourth) if err != nil { return userInfo } userName, _ := url.QueryUnescape(userInfo.Name) userInfo.ID = uid userInfo.Name = userName userInfo.Valid = true return userInfo }