middleware

package
v0.4.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2026 License: MIT Imports: 18 Imported by: 0

Documentation

Overview

Package middleware 提供服务器中间件链构建工具。

Package middleware provides HTTP/gRPC middleware implementations.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GetAllowedOrigins

func GetAllowedOrigins(corsConfig *conf.CORS) []string

GetAllowedOrigins 获取配置的允许源列表(用于日志等场景)

func IsEnabled

func IsEnabled(corsConfig *conf.CORS) bool

IsEnabled 检查 CORS 配置是否启用(用于日志等场景)

func Middleware

func Middleware(corsConfig *conf.CORS) func(http.Handler) http.Handler

Middleware 创建 CORS 中间件,直接接受 conf.CORS 配置 如果 corsConfig 为 nil 或 Enable 为 false,返回透传中间件

Types

type ChainBuilder

type ChainBuilder struct {
	// contains filtered or unexported fields
}

ChainBuilder 构建标准中间件链。

中间件顺序(按 Build 输出顺序):

  1. Recovery - 捕获 panic,防止服务崩溃
  2. Tracing - 分布式链路追踪(可选,需调用 WithTrace)
  3. Logging - 请求/响应日志
  4. RateLimit - 限流保护(默认启用,可调用 WithoutRateLimit 禁用)
  5. Validate - Proto 参数校验
  6. Metrics - 指标收集(可选,需调用 WithMetrics)
  7. Audit - 审计事件采集(可选,需调用 WithAudit);位于切片末尾, OUTER 于用户后续 append 的 authn/authz,保证 authn 失败短路时 Collector 仍能在 LIFO 后置阶段 emit 审计事件

使用示例:

import (
    "github.com/Servora-Kit/servora/security/authn/jwt"
    pkgmw "github.com/Servora-Kit/servora/transport/server/middleware"
)

httpLogger := logger.With(l, "http/server/my-service")
ms := pkgmw.NewChainBuilder(httpLogger).
    WithTrace(trace).
    WithMetrics(mtc).
    WithAudit(recorder).
    Build()
// 业务通过 builtin append 追加 authn/authz wrapper(canonical entry 是引擎子包)
ms = append(ms, jwt.Server(jwt.WithVerifier(v)), authz.Server(fgaAuth))

自实现 Authenticator 的高级用法(非 jwt 载体或自定义引擎):

// 单引擎:直接传给 authn.Server
ms = append(ms, authn.Server(myCustomAuth))
// 多引擎并存:用 authn.Named + authn.Multi 包一层
ms = append(ms, authn.Server(authn.Multi(authn.Named("custom", myCustomAuth))))

注意:

  • HTTP 和 gRPC 共享同一个 ChainBuilder,通过传入不同的 Logger 区分
  • 返回的切片可以通过 builtin `append` 追加业务特定的中间件(如 authn / authz / selector);ChainBuilder 不提供 fluent `Append` 方法
  • 如果需要完全自定义中间件顺序,请不要使用此 Builder,手动构建切片

func NewChainBuilder

func NewChainBuilder(l log.Logger) *ChainBuilder

NewChainBuilder 创建中间件链构建器。

logger 参数是必须的,用于 logging 中间件。 建议使用 logger.With(l, "http/server/xxx") 或 logger.With(l, "grpc/server/xxx") 来区分协议。

func (*ChainBuilder) Build

func (b *ChainBuilder) Build() []middleware.Middleware

Build 构建并返回中间件切片。

中间件按以下固定顺序添加:

  1. Recovery - 必须第一个,捕获所有后续中间件的 panic
  2. Tracing - 在 logging 之前,确保日志可以关联 trace ID
  3. Logging - 记录请求/响应
  4. RateLimit - 在业务逻辑之前进行限流
  5. Validate - Proto 参数校验
  6. Metrics - 记录请求指标
  7. Audit - 审计事件采集(可选, WithAudit);末尾,OUTER 于用户 append 的 authn/authz,保证 authn 失败短路时 Collector 仍能 emit

返回的切片可以通过 append 追加业务特定的中间件。

func (*ChainBuilder) WithAudit added in v0.4.5

func (b *ChainBuilder) WithAudit(rec *audit.Recorder, opts ...audit.CollectorOption) *ChainBuilder

WithAudit 启用审计中间件 audit.Collector。

rec 为 nil 时跳过 audit middleware——Build 输出不包含任何 audit middleware(与 WithTrace(nil) / WithMetrics(nil) "传 nil 跳过" 语义一致)。 注意:若先前已通过 WithAudit(rec) 设置过 recorder,再调用 WithAudit(nil) 会**清除**已设置的 recorder(后写覆盖语义),而非保留前值。

多次调用 WithAudit 时仅最后一次生效(后写覆盖,与 WithTrace / WithMetrics 一致)。

opts 透传给 audit.Collector,未来 Collector 新增 option 不需要 builder 同步维护。

audit.Collector 在 Build 切片的最后位置——保证业务方后续 append 的 authn/authz 在执行链上 inner 于 Collector,authn 失败短路时 Collector 仍能在 LIFO 后置阶段 emit 审计事件。详见 obs/audit/doc.go 的 mount contract。

func (*ChainBuilder) WithMetrics

func (b *ChainBuilder) WithMetrics(m *telemetry.Metrics) *ChainBuilder

WithMetrics 启用指标收集。

如果 m 为 nil,则跳过 metrics 中间件。 metrics 中间件会记录请求计数和延迟分布。

func (*ChainBuilder) WithTrace

func (b *ChainBuilder) WithTrace(t *conf.Trace) *ChainBuilder

WithTrace 启用分布式链路追踪。

如果 t 为 nil 或 t.Endpoint 为空,则跳过 tracing 中间件。 这允许在未配置 trace endpoint 的环境中优雅降级。

func (*ChainBuilder) WithoutRateLimit

func (b *ChainBuilder) WithoutRateLimit() *ChainBuilder

WithoutRateLimit 禁用限流中间件。

默认情况下限流是启用的,这是生产环境的推荐配置。 仅在以下场景考虑禁用:

  • 本地开发/测试环境
  • 内部服务间调用(已有上游限流)
  • 性能压测

type MatcherMode

type MatcherMode int

MatcherMode controls matching strategy

const (
	// Exact matches the full operation string or method-only fallback
	Exact MatcherMode = iota
	// Prefix matches any operation with given prefix
	Prefix
)

type WhiteList

type WhiteList struct {
	// contains filtered or unexported fields
}

WhiteList holds whitelist data and provides selector helpers. Operations in the whitelist will SKIP the auth middleware.

func NewWhiteList

func NewWhiteList(mode MatcherMode, ops ...string) *WhiteList

NewWhiteList creates a WhiteList with optional initial ops and mode.

func (*WhiteList) Add

func (w *WhiteList) Add(ops ...string) *WhiteList

Add appends operations to the whitelist (thread-safe)

func (*WhiteList) Clear

func (w *WhiteList) Clear() *WhiteList

Clear empties the whitelist

func (*WhiteList) IsWhitelisted

func (w *WhiteList) IsWhitelisted(op string) bool

IsWhitelisted returns true if operation is whitelisted

func (*WhiteList) MatchFunc

func (w *WhiteList) MatchFunc() selector.MatchFunc

MatchFunc returns a selector.MatchFunc that returns true to execute middleware. It will return false (skip middleware) when op is whitelisted.

func (*WhiteList) Merge

func (w *WhiteList) Merge(other *WhiteList) *WhiteList

Merge creates a new WhiteList containing items from both whitelists

func (*WhiteList) Set

func (w *WhiteList) Set(ops []string) *WhiteList

Set replaces the whitelist with provided operations

func (*WhiteList) Snapshot

func (w *WhiteList) Snapshot() []string

Snapshot returns a slice copy of whitelist entries

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL