package router import ( "net/http" "github.com/gin-gonic/gin" "ws_usernode/internal/api" "ws_usernode/internal/auth" ) // sessionMiddleware 从 cookie 解析会话并注入 gin context;未登录返回 401。 // 会话为 DB 存储,任何节点实例均可校验(兼容多实例)。 func sessionMiddleware(sessions auth.SessionStore) gin.HandlerFunc { return func(c *gin.Context) { sid := api.SessionIDFromCookie(c) if sid == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "未登录"}) return } sess, err := sessions.Get(c.Request.Context(), sid) if err != nil { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "会话失效或已过期"}) return } c.Set(api.SessionContextKey, sess) c.Next() } } // requireUserType 校验会话主体类型(admin / user)。空串表示任意登录主体。 func requireUserType(userType string) gin.HandlerFunc { return func(c *gin.Context) { sess, ok := c.Get(api.SessionContextKey) if !ok { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "未登录"}) return } s := sess.(*auth.Session) if userType != "" && s.UserType != userType { c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "权限不足"}) return } c.Next() } }