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 参考中的过滤器。
搜索规则也可以是空对象。在这种情况下,租户令牌将有权访问索引中的所有文档。
单个过滤器
在此示例中,用户将只收到 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
。
令牌的过期日期不能超过其父 API 密钥的过期日期。 设置令牌过期日期是可选的,但强烈建议这样做。没有过期日期的令牌将无限期保持有效,这可能带来安全隐患。撤销没有过期日期的令牌的唯一方法是删除其父 API 密钥。更改实例的主密钥将强制 Meilisearch 重新生成所有 API 密钥,并且还会使所有现有租户令牌失效。