消费者
本文档将介绍 APISIX 中消费者(Consumers)的基本概念以及为什么需要它们。你将了解一些相关概念,包括如何将消费者信息传递给上游、消费者访问限制以及消费者身份验证和授权。
在文档末尾探索其他资源,以获取有关相关主题的更多信息。
概述
在 APISIX 中,消费者(Consumer)对象代表向 API 网关发送请求并消费后端服务的用户、应用程序或主机。它与身份验证系统结合使用;也就是说,每个消费者都至少关联一个身份验证插件。
如果你有不同的消费者向你的系统发送请求,并且你需要 APISIX 基于消费者执行某些功能(例如限流限速),则消费者对象会派上用场。这些功能由消费者中配置的 APISIX 插件提供。
下图说明了 APISIX 的一个示例,其中包含一个启用了 key-auth 的路由和两个消费者 John 和 Jane。John 和 Jane 分别使用他们的 凭证 对路由进行身份验证。然后只允许经过身份验证的请求访问上游资源:
上述配置可确保如果向 APISIX 发送请求:
- 没有任何密钥或密钥错误,请求将被拒绝。
- 使用
john-key,请求经过身份验证并转发到上游服务。 - 使用
jane-key,请求经过身份验证并转发到上游服务。消费者上的限流限速插件limit-count也会生效,将请求数量限制为在任何 5 秒窗口内最多 2 个。如果超过限流限速阈值,请求将被拒绝。
请注意,当消费者成功通过身份验证时,APISIX 会在将请求代理到上游服务之前向请求添加额外的标头,例如 X-Consumer-Username、X-Credential-Identifier、X-Consumer-Custom-ID。上游服务将能够区分消费者并根据需要实施其他逻辑。如果任何这些值不可用,则不会添加相应的标头。
将消费者信息传递给上游
对于某些用例,例如日志记录、分析和审计,你可能希望将消费者信息传递给上游服务。默认情况下,消费者信息不会暴露给上游;但是,你可以使用 proxy-rewrite 插件将所需信息包含在标头中:
{
"plugins":{
...,
"proxy-rewrite":{
"headers":{
"set":{
"X-Consumer-Name":"$consumer_name"
}
}
}
}
}
消费者访问限制
你可以通过在 consumer-restriction 插件中施加基于消费者名称、HTTP 方法或其他参数的限制来控制对 API 的请求访问。
例如,如果你想将 Jane 列入黑名单,禁止其访问你的上游服务,而无需更改 概述 示例中的任何消费者配置,你可以将路由中的插件配置更新为以下内容:
{
"plugins":{
"key-auth":{},
"consumer-restriction":{
"blacklist":["Jane"]
}
}
}
或者,如果你想严格允许 FetchBot 通过 HTTP GET 方法访问,你可以将插件配置(在路由或消费者中)更新为以下内容:
{
"plugins":{
...,
"consumer-restriction":{
"allowed_by_methods":[
{
"user":"FetchBot",
"methods":["GET"]
}
]
}
}
}
consumer-restriction 插件还可以与 路由、服务 和 消费者组 一起使用。
身份验证与授权
在基于 APISIX 的架构中构建身份验证和授权主要有两种设计模式。
第一种也是最常用的方法是通过第三方 身份提供商 (IdP) 对请求进行身份验证和授权,例如 Keycloak:
在某些环境中,请求可能需要经过多个 IdP 才能转发到上游服务。在这种情况下,你可以在一个消费者上配置多个身份验证插件,每个插件对应一个 IdP;只有当所有 IdP 都授予请求访问权限时,APISIX 才会显示成功响应。
当有多个身份验证插件时,插件执行顺序 由插件的优先级决定,可以使用 _meta.priority 覆盖。
第二种也是更基本的方法是在 API 网关本身执行身份验证和授权,使用 key-auth、basic-auth、jwt-auth、hmac-auth 插件:
有关如何根据你的特定需求配置身份验证和授权的详细信息,请参阅操作指南中的 身份验证部分。
其他资源
- 快速入门 - 配置密钥认证
- Admin API - Consumer
consumer-restriction插件- 核心概念 - 凭证