租户令牌有效载荷参考

    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 无法检查搜索规则筛选器是否有效。无效的搜索规则在搜索时会返回错误。

    请参阅搜索 API 参考以获取有关 Meilisearch 筛选器语法的更多信息

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

    {
      "INDEX_NAME": {}
    }
    

    示例

    单个筛选器

    在此示例中,用户将仅收到 medical_records 索引中 user_id 等于 1 的文档

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

    多个筛选器

    在此示例中,用户将仅收到 medical_records 索引中 user_id 等于 1published 字段等于 true 的文档

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

    允许访问索引中的所有文档

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

    {
      "medical_records": {}
    }
    

    使用部分通配符目标多个索引

    在此示例中,用户将收到任何以 medical 开头的索引中的文档。这包括 medical_recordsmedical_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 密钥过期,则使用它创建的任何租户令牌都将失效。如果由于主密钥更改而删除或重新生成 API 密钥,则同样适用。

    过期日期

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

    {
      "exp": 1646756934
    }
    

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

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

    撤销没有过期日期的令牌

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

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