Meilisearch 的租户令牌是 JSON Web 令牌 (JWT)。它们的负载由三个元素组成:搜索规则、一个 API 密钥 UID 和一个可选的 过期日期

负载示例

{
  "exp": 1646756934,
  "apiKeyUid": "at5cd97d-5a4b-4226-a868-2d0eb6d197ab",
  "searchRules": {
    "INDEX_NAME": {
      "filter": "attribute = value"
    }
  }
}

搜索规则

搜索规则对象是一组指令,定义了 Meilisearch 将在每次使用特定租户令牌进行的查询中强制执行的搜索参数。

搜索规则对象

searchRules 必须是 JSON 对象。每个键必须对应一个或多个索引

{
  "searchRules": {
    "*": {},
    "INDEX_*": {},
    "INDEX_NAME_A": {}
  }
}

每个搜索规则对象可能包含一个 `filter` 键。此 `filter` 的值必须是 筛选表达式

{
  "*": {
    "filter": "attribute_A = value_X AND attribute_B = value_Y"
  }
}

Meilisearch 会将此筛选器应用于使用该租户令牌进行的所有搜索。令牌只能访问 `searchRules` 对象中存在的索引。

令牌可以包含任意数量索引的规则。特定规则集优先并覆盖 `*` 规则。

由于租户令牌是在您的应用程序中生成的,Meilisearch 无法检查搜索规则筛选器是否有效。无效的搜索规则在搜索时会抛出错误。

有关 Meilisearch 筛选语法的更多信息,请查阅搜索 API 参考。

搜索规则也可以是一个空对象。在这种情况下,租户令牌将拥有访问索引中所有文档的权限

{
  "INDEX_NAME": {}
}

示例

单个筛选器

在此示例中,用户将只收到 `user_id` 等于 `1` 的 `medical_records` 文档

{
  "medical_records": {
    "filter": "user_id = 1"
  }
}

多个筛选器

在此示例中,用户将只收到 `user_id` 等于 `1` 且 `published` 字段为 `true` 的 `medical_records` 文档

{
  "medical_records": {
    "filter": "user_id = 1 AND published = true"
  }
}

授予访问索引中所有文档的权限

在此示例中,用户可以访问 `medical_records` 中的所有文档

{
  "medical_records": {}
}

使用部分通配符定位多个索引

在此示例中,用户将收到以 `medical` 开头的任何索引中的文档。这包括 `medical_records` 和 `medical_patents` 等索引

{
  "medical*": {
    "filter": "user_id = 1"
  }
}

使用通配符定位所有索引

在此示例中,用户将收到整个实例中任何索引中的文档

{
  "*": {
    "filter": "user_id = 1"
  }
}

手动定位多个索引

在此示例中,用户可以访问所有索引中 `user_id = 1` 的文档,除一个例外。查询 `medical_records` 时,用户将只能访问已发布的文档

{
  "*": {
    "filter": "user_id = 1"
  },
  "medical_records": {
    "filter": "user_id = 1 AND published = true",
  }
}

API 密钥 UID

租户令牌负载必须包含 API 密钥 UID 以验证请求。UID 是一个标识 API 密钥的字母数字字符串

{
  "apiKeyUid": "at5cd97d-5a4b-4226-a868-2d0eb6d197ab"
}

查询 获取单个 API 密钥端点 以获取 API 密钥的 UID。

UID 必须指示一个有权访问 搜索操作 的 API 密钥。令牌拥有与用于生成它的 API 密钥相同的索引和路由访问权限。

由于主密钥不是 API 密钥,您不能使用主密钥来创建租户令牌。避免暴露 API 密钥并始终在应用程序的后端生成令牌

如果 API 密钥过期,使用它创建的任何租户令牌都将失效。如果 API 密钥因主密钥更改而被删除或重新生成,也适用同样的情况。

过期日期

过期日期必须是 UNIX 时间戳或 `null`

{
  "exp": 1646756934
}

令牌的过期日期不能超过其父级 API 密钥的过期日期。

设置令牌过期日期是可选的,但强烈建议这样做。没有过期日期的令牌将无限期有效,可能成为安全隐患。

撤销没有过期日期的令牌的唯一方法是 删除 其父级 API 密钥。

更改实例的主密钥将强制 Meilisearch 重新生成所有 API 密钥,并且还会使所有现有租户令牌失效。