跳到正文
Træfɪk

ForwardAuth

forwardAuth 中间件将认证委托给外部服务。 如果该服务返回 2XX 状态码,则授予访问权限,并执行原始请求。 否则,将返回认证服务器的响应。

配置示例

# Forward authentication to example.com
http:
  middlewares:
    test-auth:
      forwardAuth:
        address: "https://example.com/auth"
# Forward authentication to example.com
[http.middlewares]
  [http.middlewares.test-auth.forwardAuth]
    address = "https://example.com/auth"
# Forward authentication to example.com
labels:
  - "traefik.http.middlewares.test-auth.forwardauth.address=https://example.com/auth"
// Forward authentication to example.com
{
  "Tags" : [
    "traefik.http.middlewares.test-auth.forwardauth.address=https://example.com/auth"
  ]
}
# Forward authentication to example.com
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-auth
spec:
  forwardAuth:
    address: https://example.com/auth

配置选项

字段 说明 默认值 必填
address 认证服务器地址。 "" 是
trustForwardHeader 信任所有 X-Forwarded-* 请求头。
trustForwardHeader 选项已弃用,将在下一个主版本中移除。
更多信息见此处。
- 否
authResponseHeaders 要从认证服务器响应中复制并设置到转发请求上的请求头列表,替换任何已有的冲突请求头。 [] 否
authResponseHeadersRegex 用于匹配请求头的正则表达式。先移除所有匹配的请求头,再从认证服务器响应中复制匹配的请求头,并设置到转发请求上。
更多信息见此处。
"" 否
authRequestHeaders 从请求中复制给认证服务器的请求头列表。
可用于过滤不应传给认证服务器的请求头。
未设置或为空时,传递所有请求头。
[] 否
addAuthCookiesToResponse 从认证服务器复制到响应中的 Cookie 列表,替换转发响应中已有的冲突 Cookie。
请注意,与配置列表匹配的所有后端 Cookie 都不会添加到响应中。
[] 否
forwardBody 将 forwardBody 设置为 true 可发送请求体。由于 Traefik 会在转发前读取请求体,这会破坏流式传输。 false 否
maxBodySize 设置 maxBodySize 来限制请求体大小,单位为字节。超出此大小时返回 401(未授权)。未设置时,请求体大小不受限制,可能带来性能或安全影响。
更多信息见此处。
-1 否
maxResponseBodySize 设置 maxResponseBodySize 来限制认证服务器的响应体大小,单位为字节。超出此限制时返回 401(未授权)。未设置时,响应体大小不受限制,可能带来性能或安全影响。
更多信息见此处。
- 否
headerField 定义用于存储已认证用户的请求头字段。 "" 否
preserveLocationHeader 定义是将 Location 头原样转发给客户端,还是为其添加认证服务器域名前缀。 false 否
preserveRequestMethod 定义向认证服务器转发请求时,是否保留原始请求方法。 false 否
authSigninURL 指定认证服务器返回 401 Unauthorized 时重定向到的 URL。 "" 否
tls.ca 设置用于与认证服务器建立安全连接的证书颁发机构证书路径,默认使用系统证书包。 "" 否
tls.cert 设置用于与认证服务器建立安全连接的公钥证书路径。使用此选项时,必须设置 key 选项。 "" 否
tls.key 设置用于与认证服务器建立安全连接的私钥路径。使用此选项时,必须设置 cert 选项。 "" 否
tls.caSecret 定义包含证书颁发机构证书的 Secret,用于与认证服务器建立安全连接;默认使用系统证书包。此选项仅适用于 Kubernetes CRD。 否
tls.certSecret 定义包含私钥和公钥证书的 Secret,用于与认证服务器建立安全连接。此选项仅适用于 Kubernetes CRD。 否
tls.insecureSkipVerify 在 TLS 连接期间,如果此选项设置为 true,认证服务器将接受服务端提供的任何证书,而不考虑其涵盖的主机名。 false 否

authResponseHeadersRegex 响应头正则表达式

允许使用正则表达式对请求头名称进行部分匹配。

应使用字符串起始(^)和字符串结束($)锚点,确保完整匹配请求头名称。

可以使用 Go Playground 或 Regex101 等在线工具测试正则表达式和替换规则。

maxBodySize 请求体大小上限

maxBodySize 选项控制转发给认证服务器的请求体最大大小。

⚠️ 重要安全注意事项

默认情况下,未设置 maxBodySize(值为 -1),即请求体大小不受限制。这可能带来显著的安全和性能影响:

  • 安全风险:攻击者可能发送极大的请求体,导致 DoS 攻击或内存耗尽。
  • 性能影响:大型请求体消耗内存和处理资源,影响整个系统的性能。
  • 资源消耗:不受限制的请求体大小可能导致非预期的资源使用情况。

建议配置

强烈建议根据具体使用场景设置合适的 maxBodySize 值:

# For most web applications (1MB limit)
maxBodySize: 1048576  # 1MB in bytes

# For API endpoints expecting larger payloads (10MB limit)  
maxBodySize: 10485760  # 10MB in bytes

# For file upload authentication (100MB limit)
maxBodySize: 104857600  # 100MB in bytes

设置 maxBodySize 的指导原则

  • Web 表单:1–5MB 通常足以满足大多数表单提交。
  • API 端点:考虑预期最大的 JSON/XML 负载,并预留余量。
  • 文件上传:根据预期最大的文件大小设置。
  • 高流量服务:使用较小限制,避免资源耗尽。

maxResponseBodySize 响应体大小上限

maxResponseBodySize 选项定义认证服务器响应体允许的最大大小,单位为字节。 如果响应体超过配置的限制,则以 401(未授权)状态拒绝请求。 未设置时,请求体大小不受限制,可能带来性能或安全影响。

警告

强烈建议将此选项设置为适当的值。 不设置(或设为 -1)会允许无限大的响应体,可能导致 DoS 攻击和内存耗尽。

trustForwardHeader 信任转发头

警告

trustForwardHeader 选项已弃用,将在下一个主版本中移除。

使用 forwardedHeaders.trustedIPs 在 入口点层级配置可信 IP, 并在此中间件上将 trustForwardHeader 设置为 true。

在此配置下,入口点负责清理传入的 X-Forwarded-* 请求头: 移除不可信客户端发送的此类请求头,仅保留来自可信上游代理的请求头。 当 ForwardAuth 中间件处理请求时,可以保证所有 X-Forwarded-* 请求头都可信, 包括中间件链中其他中间件有意添加的请求头,例如 StripPrefix 中间件设置的 X-Forwarded-Prefix。

如果没有显式设置 trustForwardHeader,Traefik 会在启动时记录警告,并采用旧行为:移除部分 X-Forwarded-* 请求头(例如 X-Forwarded-For、X-Forwarded-Proto),但原样转发其他请求头(例如 X-Forwarded-Prefix)。 要消除此警告,请显式将 trustForwardHeader 设置为 true 或 false。

将 trustForwardHeader 选项设为 true,即可信任所有 X-Forwarded-* 请求头。

转发请求头

以下请求属性会以 X-Forwarded- 请求头的形式提供给转发认证目标端点。

属性 转发请求头
HTTP 方法 X-Forwarded-Method
协议 X-Forwarded-Proto
主机 X-Forwarded-Host
请求 URI X-Forwarded-Uri
来源 IP 地址 X-Forwarded-For

在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。

为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证