feat(router): add whitelist mechanism for http driver and auth plugin

- implement route whitelist registration and wildcard matching in RouterExtension
- add cookie store session fallback when Redis is disabled in driver_http
- actively register public auth endpoints to whitelist in auth plugin
- update user handlers to persist session and clear cookie on logout
- document router whitelist mechanism in AGENTS.md and new-api skill
This commit is contained in:
ryan
2026-08-29 11:39:13 +08:00
parent 53ae3007d0
commit e0f2309520
17 changed files with 411 additions and 32 deletions
+31 -25
View File
@@ -9,6 +9,7 @@ import (
"strconv"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-contrib/sessions/redis"
"github.com/gin-gonic/gin"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
@@ -33,36 +34,12 @@ func BuildEngineWithConfig(appCfg httpAppConfig, redisCfg httpRedisConfig) (*gin
r.Use(gin.Recovery())
r.Use(corsMiddleware())
addrs := redisCfg.Addrs
sessionAddr := "localhost:6379"
if len(addrs) > 0 {
sessionAddr = addrs[0]
}
sessionSecret := appCfg.SessionSecret
if sessionSecret == "" {
sessionSecret = "wavelet-default-session-secret"
}
sessionStore, err := redis.NewStoreWithDB(
redisCfg.MinIdleConn,
"tcp",
sessionAddr,
redisCfg.Username,
redisCfg.Password,
strconv.Itoa(redisCfg.DB),
[]byte(sessionSecret),
)
if err != nil {
return nil, err
}
// 设置 Session Redis Key 前缀
if redisCfg.KeyPrefix != "" {
if err := redis.SetKeyPrefix(sessionStore, redisCfg.KeyPrefix+"session:"); err != nil {
log.Printf("[API] set session key prefix failed: %v\n", err)
}
}
sessionStore := initSessionStore(sessionSecret, redisCfg)
sessionCookieName := appCfg.SessionCookieName
if sessionCookieName == "" {
@@ -95,3 +72,32 @@ func BuildEngineWithConfig(appCfg httpAppConfig, redisCfg httpRedisConfig) (*gin
return r, nil
}
func initSessionStore(sessionSecret string, redisCfg httpRedisConfig) sessions.Store {
if !redisCfg.Enabled || len(redisCfg.Addrs) == 0 {
return cookie.NewStore([]byte(sessionSecret))
}
sessionAddr := redisCfg.Addrs[0]
store, err := redis.NewStoreWithDB(
redisCfg.MinIdleConn,
"tcp",
sessionAddr,
redisCfg.Username,
redisCfg.Password,
strconv.Itoa(redisCfg.DB),
[]byte(sessionSecret),
)
if err != nil {
log.Printf("[driver_http] init redis session store failed, fallback to cookie store: %v\n", err)
return cookie.NewStore([]byte(sessionSecret))
}
if redisCfg.KeyPrefix != "" {
if err := redis.SetKeyPrefix(store, redisCfg.KeyPrefix+"session:"); err != nil {
log.Printf("[API] set session key prefix failed: %v\n", err)
}
}
return store
}