尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

meilisearch-go 租户 Token 教程:如何用 JWT 实现多租户搜索权限隔离

meilisearch-go 租户 Token 教程:如何用 JWT 实现多租户搜索权限隔离 meilisearch-go 租户 Token 教程如何用 JWT 实现多租户搜索权限隔离【免费下载链接】meilisearch-goGolang wrapper for the Meilisearch API项目地址: https://gitcode.com/gh_mirrors/me/meilisearch-gomeilisearch-go 是 Meilisearch 官方的 Go 语言客户端而**租户 TokenTenant Token**正是它在多租户场景下提供的搜索权限隔离利器。本教程将带你从零掌握如何用 JWT 生成租户 Token让不同用户只能搜索到自己有权访问的数据——无需为每个租户单独建索引一套搜索后端轻松搞定权限控制。为什么需要多租户搜索权限隔离想象一个 SaaS 应用多租户共享一套数据比如电商平台里不同商家共用商品索引、文档系统里不同团队共用文档索引。如果所有用户都能搜到全部数据隐私就彻底失控了。传统方案要么为每个租户建独立索引索引爆炸、维护成本高要么每次搜索都手动拼接过滤条件容易漏写、权限难收敛。而Meilisearch 租户 Token把权限规则直接签进令牌里服务端自动执行过滤从根上解决这两个痛点。租户 Token 的核心原理JWT 签名 Meilisearch 的租户 Token 本质是一个JWTJSON Web Token由 SDK 用 API Key 作为密钥、以 HS256 算法签名生成。它包含两个关键字段字段作用apiKeyUid父级 API Key 的 UID标识令牌的权限来源searchRules搜索规则定义可访问的索引与过滤条件当客户端拿着租户 Token 发起搜索时Meilisearch 会校验签名 叠加 searchRules 过滤天然实现搜索权限隔离。在 meilisearch-go 中这一切封装在GenerateTenantToken一个方法里对应接口定义见 meilisearch_interface.go。准备工作搭建环境 ⚙️动手前先准备好两样东西安装依赖Go 1.21go get github.com/meilisearch/meilisearch-go想阅读源码或跑集成测试可以 clone 仓库到本地git clone https://gitcode.com/gh_mirrors/me/meilisearch-go准备 API Key通过客户端创建一个带search权限的 Key拿到它的UID和Key值Key 的 UID 是生成租户 Token 的必填参数格式要求为 UUID v4。创建 Key 的方法见 meilisearch.go。初始化客户端的标准写法client : meilisearch.New(http://localhost:7700, meilisearch.WithAPIKey(你的APIKey))快速上手三步生成租户 Token GenerateTenantToken接收三个参数apiKeyUIDAPI Key 的 UID、searchRules搜索规则、options可选配置。完整实现见 meilisearch.go。第一步编写 searchRulessearchRules : map[string]interface{}{ products: map[string]string{ filter: tenant_id 42, // 只允许搜索当前租户的数据 }, }第二步生成令牌apiKeyUID : 父级APIKey的UID token, err : client.GenerateTenantToken(apiKeyUID, searchRules, nil) if err ! nil { log.Fatal(err) } fmt.Println(token) // 一段 JWT 字符串第三步把令牌交给前端/客户端由它代替 API Key 发起搜索。前端拿到的永远只是受限的租户 Token主 Key 绝不泄露。searchRules 的两种玩法全局规则与索引级过滤 searchRules 非常灵活对应两种典型用法玩法一所有索引统一规则用*通配searchRules : map[string]interface{}{ *: map[string]string{ filter: tenant_id 42, }, }玩法二按索引精细化控制不同索引不同策略searchRules : map[string]interface{}{ products: map[string]string{ filter: tenant_id 42, }, reviews: map[string]string{ filter: owner_id 7, }, }对应测试用例可在 meilisearch_test.go 中查看覆盖了多索引过滤、单索引过滤等多种场景。进阶配置过期时间与指定签名密钥 ⏰GenerateTenantToken的第三个参数是*TenantTokenOptions结构定义见 types.go支持两个字段APIKey自定义签名密钥。不填则默认使用初始化客户端时的 API KeyExpiresAt令牌过期时间注意使用 UTC 时间到期后令牌自动失效。options : meilisearch.TenantTokenOptions{ APIKey: 用于签名的APIKey, ExpiresAt: time.Now().Add(24 * time.Hour).UTC(), } token, err : client.GenerateTenantToken(apiKeyUID, searchRules, options)给租户 Token 设置过期时间能让权限隔离更进一步——即使令牌泄露也会自动失效。常见报错与避坑指南 ️GenerateTenantToken内置了严格校验以下是高频报错原因对照表校验逻辑见 meilisearch.go报错场景原因与解决searchRules 为 nil搜索规则不能为空至少给一个空对象{}提示缺少 API Key既没在 options 里传APIKey客户端初始化时也没配 KeyapiKeyUid 格式错误必须是合法的 UUID v4 格式校验函数见 helper.goexpiresAt 过期过期时间必须晚于当前时间实战收尾用租户 Token 发起搜索 ✅生成令牌后用WithAPIKey传入令牌即可搜索示例见 examples/search/main.gosearchClient : meilisearch.New( http://localhost:7700, meilisearch.WithAPIKey(token), // 传入租户 Token ) result, err : searchClient.Index(products).Search(手机, meilisearch.SearchRequest{})Meilisearch 会自动在products索引上叠加tenant_id 42过滤返回结果天然只属于该租户权限隔离即刻生效。小结 通过 meilisearch-go 的GenerateTenantToken只需几行代码就能基于 JWT 实现强大的多租户搜索权限隔离一套索引、一套后端却能按租户精准投放搜索结果。配合过期时间与索引级过滤规则足以应对绝大多数 SaaS 权限场景。现在就动手试试让你的搜索服务安全又优雅【免费下载链接】meilisearch-goGolang wrapper for the Meilisearch API项目地址: https://gitcode.com/gh_mirrors/me/meilisearch-go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表