Jelajahi Sumber

新增auth和page中间件

dcsunny 4 tahun lalu
induk
melakukan
3fe2085b41
2 mengubah file dengan 122 tambahan dan 0 penghapusan
  1. 71 0
      http/middleware/auth.go
  2. 51 0
      http/middleware/page.go

+ 71 - 0
http/middleware/auth.go

@@ -0,0 +1,71 @@
+package middleware
+
+import (
+	"context"
+	"strconv"
+	"strings"
+
+	"git.ikuban.com/server/kratos-utils/common"
+
+	"github.com/go-kratos/kratos/v2/errors"
+	"github.com/go-kratos/kratos/v2/middleware"
+	"github.com/go-kratos/kratos/v2/transport/http"
+)
+
+const (
+	Bearer = "Bearer "
+)
+
+var (
+	nowAuthURI = make(map[string]bool)
+)
+
+func Auth(handler middleware.Handler) middleware.Handler {
+	return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
+		if info, ok := http.FromServerContext(ctx); ok {
+			uri := info.Request.RequestURI
+			if _, ok1 := nowAuthURI[uri]; ok1 {
+				return handler(ctx, req)
+			}
+
+			token := info.Request.Header.Get("Authorization")
+			if token == "" {
+				return nil, unauthorized()
+			}
+			if strings.Contains(token, Bearer) {
+				token = strings.Replace(token, Bearer, "", 1)
+			} else {
+				return nil, unauthorized()
+			}
+
+			uid, _, claimMap, err := common.DefaultJWT.Parse(token)
+			if err != nil {
+				return nil, unauthorized()
+			}
+			var userID int64
+			if uid != "" {
+				userID, _ = strconv.ParseInt(uid, 10, 64)
+			}
+			if userID <= 0 {
+				return nil, unauthorized()
+			}
+
+			ctx = context.WithValue(ctx, "user_id", userID)
+			ctx = context.WithValue(ctx, "jwt_claims", claimMap)
+			ctx = context.WithValue(ctx, "auth_token", token)
+		}
+
+		return handler(ctx, req)
+	}
+}
+
+func unauthorized() error {
+	return &errors.StatusError{
+		Code:    401,
+		Message: "Unauthorized",
+	}
+}
+
+func AddNotAuthURI(r string) {
+	nowAuthURI[r] = true
+}

+ 51 - 0
http/middleware/page.go

@@ -0,0 +1,51 @@
+package middleware
+
+import (
+	"context"
+	"strconv"
+
+	"github.com/go-kratos/kratos/v2/middleware"
+	"github.com/go-kratos/kratos/v2/transport/http"
+)
+
+var pageURI = make(map[string]bool)
+
+func Page(handler middleware.Handler) middleware.Handler {
+	return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
+		if info, ok := http.FromServerContext(ctx); ok {
+			uri := info.Request.RequestURI
+			if _, ok1 := pageURI[uri]; !ok1 {
+				return handler(ctx, req)
+			}
+			page := 0
+			pageSize := 10
+			query := info.Request.URL.Query()
+			pageStr := query.Get("page")
+			if pageStr != "" {
+				page, err = strconv.Atoi(pageStr)
+				if err != nil {
+					return nil, err
+				}
+			}
+			pageSizeStr := query.Get("page_size")
+			if pageSizeStr != "" {
+				pageSize, err = strconv.Atoi(pageSizeStr)
+				if err != nil {
+					return nil, err
+				}
+			}
+			if pageSize == 0 {
+				pageSize = 10
+			}
+
+			ctx = context.WithValue(ctx, "page", page)
+			ctx = context.WithValue(ctx, "page_size", pageSize)
+		}
+
+		return handler(ctx, req)
+	}
+}
+
+func AddPageURI(r string) {
+	pageURI[r] = true
+}