-
Notifications
You must be signed in to change notification settings - Fork 454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: support ext_auth wasmplugin #1103
Conversation
ext_authz wasmplugin基本完成开发,还在测试中,可以先看下是否能满足你们的需求,或者有什么建议 @alexzzh @jaggerwang |
大概浏览了一下代码和文档,能够满足我们的需求,非常感谢!另外能否给一个调用部署在 Kubernetes 中的认证鉴权服务的插件使用示例,假设认证鉴权服务的服务名为 |
好的,我后续会完善下文档,添加上这个示例,感谢建议 |
示例里面 spec:
defaultConfig:
http_service:
server_uri:
service_source: dns
service_name: user.backend
service_port: 80
service_domain: user.backend.svc.cluster.local
path: /auth 我大致看了下Cluster的实现,目前我的理解是service_source为dns应该对应的控制台中服务来源为DNS域名类型,Kubernetes中service对应的控制台中服务来源为Kubernetes类型 然后这块,目前还有authorization_response中的allowed_client_headers配置还没有验证,其他都已经验证过了,我会把这两个case都验证完,再转成正式的pr |
cc @CH3CHO |
我晚点补充下matcher.go的单元测试,然后处理下和#1113 的代码冲突 |
…into wasm-ext-authz
# Conflicts: # plugins/wasm-go/extensions/cluster-key-rate-limit/README.md # plugins/wasm-go/extensions/cluster-key-rate-limit/go.mod
代码已提交,麻烦帮忙review下 @CH3CHO |
|
||
type Matcher interface { | ||
Match(s string) bool | ||
IgnoreCase() bool |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IgnoreCase 感觉像是一个操作,但实际是获取在比较时是否忽略大小写的标识。可以考虑改成 IsCaseInsensitive。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
看到下面才意识到这个IgnoreCase是要让调用方先行处理的。这个设计不太好。不能因为外部的输入而影响自身的功能。要做的话也最好放到repeatedStringMatcher里,作为一个外部控制条件。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
按照现在的功能,这个函数就应该叫ShallLoweredBeforeMatch,就很怪。
return buildRepeatedStringMatcher(matchers, false) | ||
} | ||
|
||
func BuildStringMatcher(matcher gjson.Result) (Matcher, error) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
为啥这个不支持ignoreCase?
} | ||
|
||
// call ext auth server | ||
err := config.httpService.client.Do(ctx.Method(), config.httpService.path, reconvertHeaders(extAuthReqHeaders), body, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这儿有个疑问,ctx.Method() 是当前请求的 Method。但请求认证服务也是用这个 Method 吗?会不会出现二者不一样的情况?
请问这个 PR 计划跟随哪个版本发布,v1.4.2 还是 v2.0,预计的发布时间是? |
新的代码我这边已经调整好了,晚上会再提交一版,顺利的话可以赶上下个版本发布,应该是v1.4.2(这个要看具体的发布时间) |
hello, 我们上次会议讨论的两个envoy原生支持的我们生产环境会用到的特性,,目前看下来是什么情况,可以沟通交流下?
可以一步一步来,不一定要一下全部实现。 |
嗯,我这边第一版可能暂不支持这个,配置上会预留出来,后续我研究下Envoy中的具体实现,然后看下是否能支持 |
好的 非常感谢 |
配置模式和相关代码已调整,麻烦有时间帮忙review下,感谢 @CH3CHO |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@CH3CHO 看 PR 已经合并,下个版本预计什么时候发了?我们现在打算使用 Higress 来作为我们的开放 API 的网关,等着用这个插件。这周会发版吗,如果不会那我们只能先考虑其它方案了,比如 Nginx Ingress Controller + Spring Cloud Gateway。 |
如果只是插件的话,我可以先打个镜像。版本的话本周不一定,但这个月应该可以发。@jaggerwang |
好的,那麻烦先打个插件镜像,谢谢! |
试一下这个:higress-registry.cn-hangzhou.cr.aliyuncs.com/plugins/ext-auth:1.0.0 |
另外这个插件不支持像限流插件那样指定对哪些路由生效吗,比如只对特定域名下的请求才生效。 |
插件生效的逻辑是公共的,和限流插件是一致的,可以参考其他插件配置下 |
是的,插件这块配置是统一的 |
hi,如线下沟通,是service_resource为k8s时,代码处理取namespace的逻辑有点问题,这块后面我们会统一下服务配置模式,如PR #1152 沟通,到时候会提供一个新的版本使用 |
Ⅰ. Describe what this PR did
support ext_auth wasmplugin
Ⅱ. Does this pull request fix one issue?
fixes #895
Ⅲ. Why don't you add test cases (unit test/integration test)?
Ⅳ. Describe how to verify it
下面会使用httpbin做鉴权服务
调用鉴权服务with_request_body=false且200的场景:
Get请求网关:
调用认证服务成功,且传递了对应的请求头:
调用鉴权服务with_request_body=true且200的场景:
Post请求网关:
调用认证服务成功,且传递了request body和对应的请求头:
模拟调用鉴权服务500的场景:
wasmplugin.yam:
Post请求网关:
调用认证服务500,但failure_mode_allow为false,返回403:
模拟调用鉴权服务500且failure_mode_allow=true的场景:
调用认证服务500,但failure_mode_allow为true,依然会调用下游并传递了x-envoy-auth-failure-mode-allowed=true的请求头,最终返回200:
网关日志如下:
allowed_upstream_headers将鉴权服务返回的响应头传递到下游:
调用认证服务200,认证服务返回了Custom-Header的响应头,会传递给下游服务:
模拟调用鉴权服务500的场景且设置了allowed_client_headers的场景:
未设置allowed_client_headers时
请求返回认证服务返回的所有的响应头
设置allowed_client_headers只返回x-custom-header
Ⅴ. Special notes for reviews