使用官方 SDK 实现租户令牌需要两个步骤:生成租户令牌,以及使用该令牌发起搜索请求。

前提条件

  • 一个运行中的 Meilisearch 项目
  • 支持用户认证的应用程序
  • 已安装 Meilisearch 的官方 SDK 之一

使用官方 SDK 生成租户令牌

首先导入 SDK,然后创建一组搜索规则

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

搜索规则必须是一个对象,其中每个键对应实例中的一个索引。您可以为每个索引配置任意数量的过滤器。

接下来,找到您的默认搜索 API 密钥。查询获取 API 密钥端点并检查 uid 字段以获取 API 密钥的 UID:

curl \
  -X GET 'MEILISEARCH_URL/keys/API_KEY' \
  -H 'Authorization: Bearer MASTER_KEY'

为了最大程度的安全性,您还应该为租户令牌定义过期时间。

最后,将这些数据发送到所选 SDK 的租户令牌生成器:

import { generateTenantToken } from 'meilisearch/token'

const searchRules = {
  patient_medical_records: {
    filter: 'user_id = 1'
  }
}
const apiKey = 'B5KdX2MY2jV6EXfUs6scSfmC...'
const apiKeyUid = '85c3c2f9-bdd6-41f1-abd8-11fcf80e0f76'
const expiresAt = new Date('2025-12-20') // 可选参数

const token = await generateTenantToken({ apiKey, apiKeyUid, searchRules, expiresAt })

SDK 将返回一个有效的租户令牌。

使用租户令牌发起搜索请求

创建令牌后,必须将其发送到应用程序的前端。具体实现方式取决于您的具体设置。

当租户令牌可用时,可以像使用 API 密钥一样用它来认证搜索请求:

const frontEndClient = new MeiliSearch({ host: 'http://localhost:7700', apiKey: token })
frontEndClient.index('patient_medical_records').search('blood test')

应用程序在搜索时可以互换使用租户令牌和 API 密钥。例如,同一个应用程序可能使用默认搜索 API 密钥查询公共索引,而对登录用户搜索私有数据时使用租户令牌。