From 26cd59b2e0a6d60ceba3f4e56bfcce2c1f6f7a39 Mon Sep 17 00:00:00 2001 From: keven1024 Date: Sun, 27 Apr 2025 10:14:18 +0800 Subject: [PATCH] feat(backend): implement custom middleware for session management and context handling --- backend/middleware/auth.go | 40 +++++++++++++++++++++++++++++++++++ backend/middleware/context.go | 28 ++++++++++++++++++++++++ backend/middleware/session.go | 11 ++++++++++ 3 files changed, 79 insertions(+) create mode 100644 backend/middleware/auth.go create mode 100644 backend/middleware/context.go create mode 100644 backend/middleware/session.go diff --git a/backend/middleware/auth.go b/backend/middleware/auth.go new file mode 100644 index 0000000..a1a767a --- /dev/null +++ b/backend/middleware/auth.go @@ -0,0 +1,40 @@ +package middleware + +import ( + "github.com/gorilla/sessions" + "github.com/labstack/echo-contrib/session" + "github.com/labstack/echo/v4" + gonanoid "github.com/matoous/go-nanoid/v2" +) + +// CustomMiddleware 创建自定义中间件 +func AuthMiddleware() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + sess, err := session.Get("session", c) + if err != nil { + return err + } + sess.Options = &sessions.Options{ + Path: "/", + MaxAge: 86400 * 7, + HttpOnly: true, + } + if sess.Values["auth"] == nil { + id, err := gonanoid.New() + if err != nil { + return err + } + sess.Values["auth"] = id + if err := sess.Save(c.Request(), c.Response()); err != nil { + return err + } + } + + cc := c.(*CustomContext) + cc.Auth = sess.Values["auth"] + // 将自定义上下文传递给下一个处理器 + return next(cc) + } + } +} diff --git a/backend/middleware/context.go b/backend/middleware/context.go new file mode 100644 index 0000000..5124f2f --- /dev/null +++ b/backend/middleware/context.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "github.com/labstack/echo/v4" +) + +// CustomContext 扩展 echo.Context 以添加自定义功能 +type CustomContext struct { + echo.Context + Auth interface{} +} + +// NewCustomContext 创建自定义上下文的构造函数 +func NewCustomContext(c echo.Context) *CustomContext { + return &CustomContext{ + Context: c, + } +} + +// ContextMiddleware 中间件用于将标准 echo.Context 转换为 CustomContext +func ContextMiddleware() echo.MiddlewareFunc { + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) error { + cc := NewCustomContext(c) + return next(cc) + } + } +} diff --git a/backend/middleware/session.go b/backend/middleware/session.go new file mode 100644 index 0000000..6f8a21c --- /dev/null +++ b/backend/middleware/session.go @@ -0,0 +1,11 @@ +package middleware + +import ( + "github.com/gorilla/sessions" + "github.com/labstack/echo-contrib/session" + "github.com/labstack/echo/v4" +) + +func SessionMiddleware() echo.MiddlewareFunc { + return session.Middleware(sessions.NewCookieStore([]byte("secret"))) +}