ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Higress 外部认证插件 ext-auth 完全指南:对接自定义鉴权服务与黑白名单策略

Higress 外部认证插件 ext-auth 完全指南:对接自定义鉴权服务与黑白名单策略 Higress 外部认证插件 ext-auth 完全指南对接自定义鉴权服务与黑白名单策略【免费下载链接】higress AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress本篇技术指南以 Higress 开源仓库中 ext-auth 插件英文文档 为核心骨架结合插件源码与测试用例系统讲解如何通过 Higress Wasm 插件ext-auth将网关请求转发给外部授权服务完成认证鉴权。读完本文你将掌握envoy与forward_auth两种对接模式的区别与选型、全部配置字段的语义与默认值、黑白名单匹配规则的组合逻辑以及请求头转发、请求体转发、失败模式等高级用法可直接落地到生产网关中。插件定位与运行属性ext-auth是 Higress 内置的 Wasm 插件其核心职责是向外部授权服务发送鉴权请求由该服务判断客户端请求是否被授权。插件实现时参考了 Envoy 原生 ext_authz filter即 Envoy 的 External Authorization 过滤器实现了原生 filter 中“对接 HTTP 服务”的部分能力让用户无需编写 Envoy 配置即可复用已有的外部鉴权系统。插件运行属性如下插件执行阶段认证阶段Authentication Phase插件执行优先级360从源码看插件的入口在 main.go通过wrapper.SetCtx注册了配置解析函数config.ParseConfig以及onHttpRequestHeaders、onHttpRequestBody两个请求处理回调分别负责在请求头阶段发起外部鉴权调用、在需要携带请求体时于请求体阶段完成调用。这意味着插件以 Wasm 形式运行在 Envoy 数据面不依赖任何额外组件即可完成同步鉴权拦截。顶层配置字段插件整体配置为 JSON 结构在 Higress 控制台或 WasmPlugin CRD 中以 JSON 形式下发。顶层字段如下名称数据类型必填默认值描述http_serviceobject是-外部授权服务配置match_typestring否可选whitelist或blacklistmatch_listarray of MatchRule否请求匹配规则列表支持按域名、方法、路径和请求头是否存在进行匹配failure_mode_allowbool否false当设置为 true 时即使与授权服务的通信失败或者授权服务返回了 HTTP 5xx 错误仍会接受客户端请求failure_mode_allow_header_addbool否false当failure_mode_allow和failure_mode_allow_header_add都设置为 true 时若与授权服务的通信失败或授权服务返回了 HTTP 5xx 错误那么请求头中将会添加x-envoy-auth-failure-mode-allowed: truestatus_on_errorint否403当授权服务无法访问或状态码为 5xx 时设置返回给客户端的 HTTP 状态码。默认状态码是403这些字段的解析逻辑对应源码 config.go 中的ParseConfig。值得注意的源码细节status_on_error未配置解析为 0时会回落到默认值403DefaultStatusOnError见 config.go。failure_mode_allow的生效场景在 main.go 的callExtAuthServerErrorHandler中仅当鉴权服务返回 5xx或调用失败被映射为 500时才放行请求若同时开启failure_mode_allow_header_add则会在请求头中注入x-envoy-auth-failure-mode-allowed: true让上游服务知道本次请求是在“失败放行”模式下转发的。插件执行流程源码视角结合 main.go 的onHttpRequestHeaders可以梳理出插件的完整执行链路根据当前请求的域名、方法、路径以及需要时的请求头集合构造匹配请求调用config.MatchRules.Matches(...)判断该请求是否处于“需要外部鉴权”的范围内若黑白名单判定为“无需鉴权”直接DontReadRequestBody()并放行否则调用ctx.DisableReroute()禁止路由重算因为插件可能修改与路由相关的请求头若配置了with_request_body且请求确实带有请求体则设置请求体缓冲上限暂停请求头迭代等待请求体阶段处理否则直接调用checkExtAuth发起外部鉴权调用暂停整个请求流水线直至收到鉴权服务响应。http_service 配置http_service中每一项的配置字段说明名称数据类型必填默认值描述endpoint_modestring否envoy可选envoy或forward_authendpointobject是-发送鉴权请求的 HTTP 服务信息timeoutint否1000ext-auth服务连接超时时间单位毫秒authorization_requestobject否-发送鉴权请求配置authorization_responseobject否-处理鉴权响应配置从 config.go 的parseHttpServiceConfig可以看到timeout未配置时默认取1000毫秒DefaultHttpServiceTimeout该超时会透传给底层wrapper.HttpClient.Call控制对鉴权服务整次调用的超时。endpoint 配置endpoint中每一项的配置字段说明名称数据类型必填默认值描述service_namestring是-输入授权服务名称带服务类型的完整 FQDN 名称例如ext-auth.dns、ext-auth.my-ns.svc.cluster.localservice_portint否80输入授权服务的服务端口service_hoststring否-请求授权服务时设置的 Host 头不填时和 FQDN 保持一致path_prefixstringendpoint_mode为envoy时必填-endpoint_mode为envoy时客户端向授权服务发送请求的请求路径前缀request_methodstring否GETendpoint_mode为forward_auth时客户端向授权服务发送请求的 HTTP Methodpathstringendpoint_mode为forward_auth时必填-endpoint_mode为forward_auth时客户端向授权服务发送请求的请求路径源码层面的校验逻辑见 config.go 的parseEndpointConfigservice_name为空会直接报错“endpoint service name must not be empty”service_port默认 80service_host留空时发送给授权服务的Host头与 FQDN 保持一致底层通过wrapper.NewClusterClient(wrapper.FQDNCluster{...})构建 HTTP 客户端endpoint_mode为envoy时path_prefix必填此时若同时配置了request_method或path会被忽略并打印告警日志endpoint_mode为forward_auth时path必填request_method缺省为GET并统一转为大写此时若配置了path_prefix会被忽略。两种 endpoint_mode 的区别endpoint_mode为envoy时鉴权请求会使用原始请求的 HTTP Method并将配置的path_prefix作为请求路径前缀拼接上原始请求路径。例如原始请求为POST /users?apikeyxxx、path_prefix为/auth则鉴权请求为POST /auth/users?apikeyxxx。这一逻辑对应 main.go 中的path.Join(httpServiceConfig.PathPrefix, ctx.Path())。endpoint_mode为forward_auth时鉴权请求会使用配置的request_method作为 HTTP Method、配置的path作为请求路径并且 Higress 会自动生成并发送以下 header 至鉴权服务Header说明x-forwarded-proto原始请求的 scheme比如 http/httpsx-forwarded-method原始请求的方法比如 get/post/delete/patchx-forwarded-host原始请求的 hostx-forwarded-uri原始请求的 path包含路径参数比如/v1/app?testtrue在源码 main.go 中forward_auth模式下除了注入上述四个x-forwarded-*头外还会兼容旧版本额外注入x-original-method与x-original-uri两个头方便鉴权服务兼容历史客户端。两种模式的选择建议envoy模式更贴近 Envoy 原生 ext_authz 的行为适合鉴权服务希望看到“原始方法 带前缀的完整路径”的场景forward_auth模式则类似 Traefik / Caddy 等网关的 ForwardAuth 语义鉴权服务收到的是固定路径与显式的X-Forwarded-*头更适合复用为 Nginx 等编写的外部认证应用。authorization_request 配置构造鉴权请求authorization_request中每一项的配置字段说明名称数据类型必填默认值描述allowed_headersarray of StringMatcher否-设置后匹配项的客户端请求头将添加到授权服务请求中的请求头中。除了用户自定义的头部匹配规则外授权服务请求中会自动包含Authorization这个 HTTP 头endpoint_mode为forward_auth时会添加X-Forwarded-*的请求头allowed_propertiesarray of AllowedProperty否-设置后将把 Envoy filter state 中的 property 映射为 HTTP header 发送给授权服务。Envoy 支持的 property 列表可参考 Envoy 官方 attributes 文档Envoy 1.27 对应 Higress 2.2.0Envoy 1.36 对应 Higress 2.2.0headers_to_addmap[string]string否-设置将包含在授权服务请求中的请求头列表。请注意同名的客户端请求头将被覆盖with_request_bodybool否false缓冲客户端请求体并将其发送至鉴权请求中HTTP Method 为 GET、OPTIONS、HEAD 请求时不生效max_request_body_bytesint否10MB设置在内存中保存客户端请求体的最大尺寸。当客户端请求体达到在此字段中设置的数值时将会返回 HTTP 413 状态码并且不会启动授权过程。注意这个设置会优先于failure_mode_allow的配置源码细节见 config.go 与 main.goallowed_headers使用expr.BuildRepeatedStringMatcherIgnoreCase构建忽略大小写的头部匹配器即x-auth-version能同时匹配客户端发来的X-Auth-Version只有匹配的客户端请求头才会被复制进鉴权请求Authorization头是无条件自动携带的只要客户端请求中存在不受allowed_headers影响对应util.ExtractFromHeader的提取逻辑headers_to_add在allowed_headers之后设置因此同名头会覆盖客户端原始值这与文档描述一致with_request_body为 true 且请求方法为 GET/OPTIONS/HEAD 时配置解析会直接报错防止无效配置见 config.gomax_request_body_bytes默认 10MBDefaultMaxRequestBodyBytes 10 * 1024 * 1024由ctx.SetRequestBodyBufferLimit生效超限返回 HTTP 413且该判定发生在授权调用之前因此优先于failure_mode_allow。AllowedProperty 类型AllowedProperty类型每一项的配置字段说明名称数据类型必填默认值描述patharray of string是-属性路径如[route_name]或[metadata, user_id]headerstring是-映射到的请求头名称path既支持数组形式如[route_name]、[metadata, test]也支持单值形式如route_name解析逻辑见 config.go。运行时通过proxywasm.GetProperty(prop.Path)读取 Envoy filter state 属性成功则写入对应请求头属性不存在时静默跳过不会阻塞请求这一点有对应的单元测试覆盖见 main_test.go。典型用法是把route_name路由名称映射为x-route-name头发给鉴权服务使鉴权决策可以结合路由信息。authorization_response 配置处理鉴权响应authorization_response中每一项的配置字段说明名称数据类型必填默认值描述allowed_upstream_headersarray of StringMatcher否-匹配项的鉴权请求的响应头将添加到原始的客户端请求头中。请注意同名的请求头将被覆盖allowed_client_headersarray of StringMatcher否-如果不设置在请求被拒绝时所有的鉴权请求的响应头将添加到客户端的响应头中。当设置后在请求被拒绝时匹配项的鉴权请求的响应头将添加到客户端的响应头中两者的作用域有明确分工对应 main.go 与 main.goallowed_upstream_headers鉴权**成功200**时把鉴权服务的响应头按匹配规则回填到发往上游的原始请求头中常用于把鉴权服务签发的用户身份如x-user-id透传给后端业务allowed_client_headers鉴权**失败非 200**时控制哪些鉴权服务响应头出现在返回给客户端的响应头中。未配置时全部透传配置后仅透传匹配项。鉴权失败的响应处理策略对应callExtAuthServerErrorHandlermain.go鉴权服务返回5xx或不可访问调用失败映射为 500时若开启failure_mode_allow则放行请求可选注入x-envoy-auth-failure-mode-allowed: true否则以status_on_error默认 403拒绝客户端请求鉴权服务返回其他非 200 状态码如 401、403时直接以该状态码拒绝客户端请求并把鉴权服务返回的响应体与按allowed_client_headers过滤后的响应头透传给客户端拒绝响应通过util.SendResponse发出响应头会按名称排序保证输出稳定见 utils.go。StringMatcher 与 MatchRule 匹配规则StringMatcher 类型StringMatcher类型每一项的配置字段说明。在使用array of StringMatcher时会按照数组中定义的 StringMatcher 顺序依次进行配置名称数据类型必填默认值描述exactstring否exact、prefix、suffix、contains、regex中选填一项-精确匹配prefixstring否同上-前缀匹配suffixstring否同上-后缀匹配containsstring否同上-是否包含regexstring否同上-正则匹配StringMatcher 的底层实现在 matcher.goexact/prefix/suffix/contains分别对应字符串精确相等、HasPrefix、HasSuffix、Contains判断regex则使用 Goregexp.Compile编译执行。用于头部的匹配器如allowed_headers一律忽略大小写regex在需要忽略大小写时会自动为表达式加上(?i)前缀已带前缀则不会重复添加有单测覆盖。若match_type传入未知类型或正则无法编译配置解析会返回错误确保错误配置在加载阶段即被拦截。MatchRule 类型MatchRule 类型每一项的配置字段说明。在使用array of MatchRule时会按照数组中定义的 MatchRule 顺序依次进行配置名称数据类型必填默认值描述match_rule_domainstring否-匹配规则域名支持通配符模式例如*.bar.commatch_rule_method[]string否-匹配请求方法match_rule_pathstring否-匹配请求路径的规则match_rule_typestring否-匹配请求路径的规则类型可选exact、prefix、suffix、contains、regexmatch_rule_headersarray of HeaderPresenceCondition否-按请求头是否存在进行匹配数组不能为空同一规则中的所有条件必须同时满足HeaderPresenceCondition 类型HeaderPresenceCondition类型每一项的配置字段说明名称数据类型必填默认值描述namestring是-HTTP 请求头名称忽略大小写同一规则中不能配置大小写不同的重复名称existsbool是-true表示请求头存在false表示请求头不存在请求头值为空字符串时仍视为存在match_rule_headers的解析校验相当严格见 config.go必须是非空数组每个条件必须同时提供name与existsname必须是合法的非伪 HTTP 头名称通过isValidHTTPHeaderName校验字符集且同一规则内不允许出现大小写重复的头名称——例如同时配置X-Auth与x-auth会直接报错。运行时请求头名称会统一转为小写构建集合exists: true表示头必须存在空值也算存在exists: false表示头必须不存在对应 match_rules.go。黑白名单模式支持黑白名单模式配置默认为白名单模式白名单为空时所有请求都需要鉴权。语义如下whitelist规则匹配时跳过鉴权不匹配时执行鉴权blacklist规则匹配时执行鉴权不匹配时跳过鉴权。组合规则为一个规则内的域名、方法、路径和请求头条件之间是 ANDmatch_list中的规则之间是 OR。域名匹配支持*.bar.com等泛域名通配符会转换为正则见 match_rules.go 的convertWildcardToRegex路径匹配支持exact、prefix、suffix、contains、regex。另外需要特别留意authorization_request.allowed_headers仅控制转发给鉴权服务的请求头与是否调用鉴权服务无关——是否调用完全由黑白名单决定。从源码看Matches的默认分支未知模式返回true即“保持在外部鉴权范围内”体现 fail-closed失败关闭的安全倾向见 match_rules.go并有对应单测TestMatches_UnknownModeFailsClosed。默认空白名单的“全部请求都需鉴权”语义同样有单测锁定TestMatchRulesDefaults_EmptyWhitelistDenies见 expr_extra_test.go。白名单模式# 白名单模式配置符合白名单规则的请求无需验证 match_type: whitelist match_list: # 所有以 api.example.com 为域名且路径前缀为 /public 的请求无需验证 - match_rule_domain: api.example.com match_rule_path: /public match_rule_type: prefix # 针对图片资源服务器 images.example.com所有 GET 请求无需验证 - match_rule_domain: images.example.com match_rule_method: [GET] # 所有域名下路径精确匹配 /health-check 的 HEAD 请求无需验证 - match_rule_method: [HEAD] match_rule_path: /health-check match_rule_type: exact黑名单模式# 黑名单模式配置符合黑名单规则的请求需要验证 match_type: blacklist match_list: # 所有以 admin.example.com 为域名且路径前缀为 /sensitive 的请求需要验证 - match_rule_domain: admin.example.com match_rule_path: /sensitive match_rule_type: prefix # 所有域名下路径精确匹配 /user 的 DELETE 请求需要验证 - match_rule_method: [DELETE] match_rule_path: /user match_rule_type: exact # 所有以 legacy.example.com 为域名的 POST 请求需要验证 - match_rule_domain: legacy.example.com match_rule_method: [POST] # 所有包含 x-custom-auth 请求头的请求需要验证 - match_rule_headers: - name: x-custom-auth exists: true上述示例对应的匹配行为均有单元测试覆盖见 match_rules_test.go 与 main_test.go包括通配域名、多方法命中、条件留空、未知模式等边界场景可作为理解语义的补充材料。配置示例与请求流转下面假设ext-auth服务在 Kubernetes 中 serviceName 为ext-auth端口8090路径为/auth命名空间为backend即 FQDN 为ext-auth.backend.svc.cluster.local。endpoint_mode 为 envoy 时示例 1最小配置ext-auth插件的配置http_service: endpoint_mode: envoy endpoint: service_name: ext-auth.backend.svc.cluster.local service_port: 8090 path_prefix: /auth timeout: 1000使用如下请求网关当开启ext-auth插件后curl -X POST http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxx请求ext-auth服务成功ext-auth服务将接收到如下的鉴权请求注意原始 Method 为 POST路径为path_prefix 原始路径foo头不在allowed_headers中故未转发Authorization自动携带POST /auth/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 HTTP/1.1 Host: ext-auth.backend.svc.cluster.local Authorization: xxx Content-Length: 0请求ext-auth服务失败当调用ext-auth服务响应为 5xx 时客户端将接收到 HTTP 响应码 403 和ext-auth服务返回的全量响应头。假如ext-auth服务返回了x-auth-version: 1.0和x-auth-failed: true的响应头会传递给客户端HTTP/1.1 403 Forbidden x-auth-version: 1.0 x-auth-failed: true date: Tue, 16 Jul 2024 00:19:41 GMT server: istio-envoy content-length: 0补充规则当ext-auth无法访问或状态码为 5xx 时将以status_on_error配置的状态码拒绝客户端请求当ext-auth服务返回其他 HTTP 状态码如 401、403时将以返回的状态码拒绝客户端请求如果配置了allowed_client_headers具有相应匹配项的响应头将添加到客户端的响应中。示例 2请求头过滤、追加与响应头回填ext-auth插件的配置http_service: authorization_request: allowed_headers: - exact: x-auth-version headers_to_add: x-envoy-header: true authorization_response: allowed_upstream_headers: - exact: x-user-id - exact: x-auth-version endpoint_mode: envoy endpoint: service_name: ext-auth.backend.svc.cluster.local service_host: my-domain.local service_port: 8090 path_prefix: /auth timeout: 1000使用如下请求网关当开启ext-auth插件后curl -X POST http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxxext-auth服务将接收到如下的鉴权请求service_host使Host头变为my-domain.local客户端若带有x-auth-version头会被精确匹配转发x-envoy-header: true为追加头POST /auth/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 HTTP/1.1 Host: my-domain.local Authorization: xxx X-Auth-Version: 1.0 x-envoy-header: true Content-Length: 0ext-auth服务返回响应头中如果包含x-user-id和x-auth-version网关调用 upstream 时的请求中会带上这两个请求头。示例 3传递路由名称到授权服务ext-auth插件的配置http_service: authorization_request: allowed_headers: - exact: x-auth-version allowed_properties: - path: [route_name] header: x-route-name headers_to_add: x-envoy-header: true authorization_response: allowed_upstream_headers: - exact: x-user-id - exact: x-auth-version endpoint_mode: envoy endpoint: service_name: ext-auth.backend.svc.cluster.local service_host: my-domain.local service_port: 8090 path_prefix: /auth timeout: 1000使用如下请求网关当开启ext-auth插件后curl -X POST http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxxext-auth服务将接收到如下的鉴权请求x-route-name头来自 Envoy filter state 中的route_name属性POST /auth/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 HTTP/1.1 Host: my-domain.local Authorization: xxx X-Auth-Version: 1.0 x-envoy-header: true Content-Length: 0 X-Route-Name: your-route-name通过allowed_properties配置可以将 Envoy filter state 中的route_name等属性映射为 HTTP header 发送给授权服务便于授权服务根据路由信息进行鉴权决策。对应的属性转发行为在 main_test.go 中有完整的单测验证。endpoint_mode 为 forward_auth 时示例 1最小配置ext-auth插件的配置http_service: endpoint_mode: forward_auth endpoint: service_name: ext-auth.backend.svc.cluster.local service_port: 8090 path: /auth request_method: POST timeout: 1000使用如下请求网关当开启ext-auth插件后curl -i http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxx -H Host: foo.bar.com请求ext-auth服务成功ext-auth服务将接收到如下的鉴权请求固定使用request_method: POST与path: /auth自动携带四个X-Forwarded-*头原始请求的Host: foo.bar.com体现在x-forwarded-host中POST /auth HTTP/1.1 Host: ext-auth.backend.svc.cluster.local Authorization: xxx X-Forwarded-Proto: HTTP X-Forwarded-Host: foo.bar.com X-Forwarded-Uri: /users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 X-Forwarded-Method: GET Content-Length: 0请求ext-auth服务失败当调用ext-auth服务响应为 5xx 时客户端将接收到 HTTP 响应码 403 和ext-auth服务返回的全量响应头。假如ext-auth服务返回了x-auth-version: 1.0和x-auth-failed: true的响应头会传递给客户端HTTP/1.1 403 Forbidden x-auth-version: 1.0 x-auth-failed: true date: Tue, 16 Jul 2024 00:19:41 GMT server: istio-envoy content-length: 0当ext-auth无法访问或状态码为 5xx 时将以status_on_error配置的状态码拒绝客户端请求当ext-auth服务返回其他 HTTP 状态码时将以返回的状态码拒绝客户端请求如果配置了allowed_client_headers具有相应匹配项的响应头将添加到客户端的响应中。示例 2请求头过滤、追加与响应头回填ext-auth插件的配置http_service: authorization_request: allowed_headers: - exact: x-auth-version headers_to_add: x-envoy-header: true authorization_response: allowed_upstream_headers: - exact: x-user-id - exact: x-auth-version endpoint_mode: forward_auth endpoint: service_name: ext-auth.backend.svc.cluster.local service_host: my-domain.local service_port: 8090 path: /auth request_method: POST timeout: 1000使用如下请求网关当开启ext-auth插件后curl -i http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxx -H X-Auth-Version: 1.0 -H Host: foo.bar.comext-auth服务将接收到如下的鉴权请求POST /auth HTTP/1.1 Host: my-domain.local Authorization: xxx X-Forwarded-Proto: HTTP X-Forwarded-Host: foo.bar.com X-Forwarded-Uri: /users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 X-Forwarded-Method: GET X-Auth-Version: 1.0 x-envoy-header: true Content-Length: 0ext-auth服务返回响应头中如果包含x-user-id和x-auth-version网关调用 upstream 时的请求中会带上这两个请求头。示例 3传递路由名称到授权服务ext-auth插件的配置http_service: authorization_request: allowed_headers: - exact: x-auth-version allowed_properties: - path: [route_name] header: x-route-name authorization_response: allowed_upstream_headers: - exact: x-mse-consumer - exact: x-ext-auth-user endpoint_mode: forward_auth endpoint: service_name: ext-auth.backend.svc.cluster.local service_port: 8090 path: /auth request_method: POST timeout: 1000使用如下请求网关当开启ext-auth插件后curl -i http://localhost:8082/users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 -X GET -H foo: bar -H Authorization: xxx -H X-Auth-Version: 1.0 -H Host: foo.bar.comext-auth服务将接收到如下的鉴权请求POST /auth HTTP/1.1 Host: my-domain.local Authorization: xxx X-Forwarded-Proto: HTTP X-Forwarded-Host: foo.bar.com X-Forwarded-Uri: /users?apikey9a342114-ba8a-11ec-b1bf-00163e1250b5 X-Forwarded-Method: GET X-Auth-Version: 1.0 x-envoy-header: true X-Route-Name: your-route-name Content-Length: 0通过allowed_properties配置可以将 Envoy filter state 中的route_name等属性映射为 HTTP header 发送给授权服务便于授权服务根据路由信息进行鉴权决策。此处allowed_upstream_headers使用了x-mse-consumer、x-ext-auth-user等示例头说明鉴权服务可以把消费方标识等业务信息回填给上游。工程实践建议结合文档与源码给出以下几点落地建议安全默认与失败策略插件默认 fail-closed——白名单为空时所有请求都需鉴权鉴权服务不可用时默认以 403 拒绝。只有在明确接受“鉴权服务故障期间放行流量”的降级场景如内网环境或可容忍的短时风险才应开启failure_mode_allow并可配合failure_mode_allow_header_add让上游感知降级。请求头最小化透传allowed_headers采用白名单式转发配合自动携带的Authorization头可避免把客户端无关头泄露给鉴权服务allowed_upstream_headers/allowed_client_headers同理应只回填必要字段。模式选型鉴权服务按“原始方法 前缀路径”设计则选envoy模式鉴权服务依赖标准X-Forwarded-*头、固定路径端点如/auth则选forward_auth模式。切换时注意path_prefix与path/request_method的必填差异。请求体鉴权需要基于请求体内容做鉴权时开启with_request_body同时务必评估max_request_body_bytes默认 10MB超限将直接 413 且不受failure_mode_allow兜底。配置尽早校验插件在配置解析阶段即对endpoint_mode取值、path_prefix/path必填、match_rule_headers合法性、with_request_body与方法的兼容性等进行强校验见 config.go错误配置不会进入运行期可放心将配置变更纳入 CI 校验流程。如需深入阅读实现可继续查看插件的主逻辑、配置解析、匹配规则、字符串匹配器以及覆盖各场景的单元测试中文版本说明见 README.md。【免费下载链接】higress AI Gateway | AI Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/hi/higress创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表