# 扩展认证

扩展认证帮助用户使用自己服务进行认证，支持外部数据库如 MySQL， Redis 作为数据源，或者连接到 HTTP 服务做认证鉴权。

::: tip 提示

Serverless 部署不支持扩展认证功能。

:::


## 扩展认证数据源

[HTTP 认证](./http_auth.md)

[MySQL 认证](./mysql_auth.md)

[PostgreSQL 认证](./pgsql_auth.md)

[Redis 认证](./redis_auth.md)

[JWT 认证](./jwt_auth.md)

::: tip
最多支持创建两个扩展认证数据源。
:::

## 认证排序

添加了扩展认证数据源之后，用户可以对认证数据源做排序。部署将按照从左到右的顺序进行认证，默认的认证链顺序为默认认证 -> 扩展认证。
- 如果认证成功，终止认证链并允许客户端接入。
- 如果认证失败，终止认证链并禁止客户端接入。
- 如果当前数据源未能匹配，将进入下一个认证源进行认证。

### 如何创建认证链

您可以在部署页面的**访问控制** -> **客户端认证** -> **扩展认证**中创建认证链。当配置并连接了扩展认证数据源后，您将在页面上看到**排序设置**区域。

1. 点击**认证排序**，进入认证顺序设置页面。
2. 拖动认证数据源的图标，左右排列进行认证顺序的编排。
3. 排序完成后，点击**确认**保存更改。

![auth_management](./_assets/auth_management.png)

## 外部资源缓存

::: tip 提示

外部资源缓存功能适用于 EMQX 5.9 及以上版本的专有版部署。

:::

EMQX Cloud 支持对来自外部后端（如 MySQL 或 Redis）的认证结果进行缓存。该缓存机制可提升认证查询的性能，减少在高吞吐量场景下对外部资源的重复访问。

::: tip 注意

外部资源缓存仅适用于扩展认证数据源。对于默认的密码认证，EMQX 不使用该缓存机制。

:::

### 外部资源缓存的工作原理

外部资源缓存用于存储客户端认证的结果，这些结果在整个集群中的所有客户端会话之间共享，有效避免重复访问外部认证后端。

认证流程如下：

1. 客户端连接并触发认证操作。
2. EMQX Cloud 首先在缓存中查找是否已有对应的认证结果：
   - 如果找到了有效的结果，则视为**缓存命中**，无需访问外部后端。
   - 如果未找到缓存结果，则视为**缓存未命中**，EMQX Cloud 会向外部后端发起查询。
3. 从后端返回的认证结果将被存入缓存，用于后续请求，并计入**缓存写入**指标。

该机制有助于降低认证延迟、减少外部资源调用，并在高负载下维持系统响应能力。

### 启用和配置外部资源缓存

您可以在部署页面的**访问控制** -> **客户端认证** -> **扩展认证**中启用并配置外部资源缓存。当扩展认证数据源已配置并连接后，页面将显示**缓存设置**区域。

1. 点击**外部资源缓存设置**打开侧边栏面板。
2. 在面板中点击**启用外部资源缓存**开关以开启或关闭缓存功能。
3. 启用后，可配置以下缓存参数：
   - **最大缓存数量**：每个节点可缓存的最大条目数。默认值：1,000,000。
   - **最大内存**：缓存可占用的最大内存。默认值：100 MB。
   - **缓存过期时间**：每条缓存项的有效时长。默认值：1 分钟。
4. 点击**更新**应用配置。

### 监控外部资源缓存状态

若要实时查看缓存指标和使用情况：

1. 将鼠标悬停在**外部资源缓存设置**右侧的箭头上；
2. 点击**外部资源缓存状态**，弹出侧边栏查看实时缓存指标。

可查看的缓存指标包括：

- **内存占用**：当前缓存占用的总内存。
- **缓存条目数**：当前存储的缓存认证结果总数。
- **缓存命中**：EMQX Cloud 成功在缓存中找到有效结果，避免访问外部后端的次数。
  - 展示数据包括：当前速率、5 分钟平均值、最大速率
- **缓存未命中**：EMQX Cloud 未能在缓存中找到结果，因而查询外部后端的次数。
  - 展示数据包括：当前速率、5 分钟平均值、最大速率
- **缓存插入**：在未命中后新增写入缓存结果的次数。
  - 展示数据包括：当前速率、5 分钟平均值、最大速率

您可以通过面板右上角的按钮刷新或重置这些统计数据。

![external_resource_cache_status](./_assets/external_resource_cache_status.png)
