本指南适用于高级和中级开发人员,它将提供一条清晰的路线图,帮助您在应用程序中高效地管理数据访问。

了解基于角色的访问控制

基于角色的访问控制 (RBAC) 是一种根据企业中各个用户的角色来规范对计算机或网络资源访问的方法。在应用程序的背景下,它指的是控制哪些用户可以访问哪些信息,从而确保数据隐私和安全性。

Meilisearch 为 RBAC 提供了一个优雅的解决方案:租户令牌。租户令牌使您能够轻松地限制用户访问他们被允许查看的特定数据。

在类似 Notion 的应用程序中使用 Meilisearch 实现 RBAC

让我们使用一个受 Notion 灵感的例子来说明这个概念,Notion 是一个多合一的工作空间,您可以在其中编写、规划、协作并井井有条地组织。

在我们简化的 Notion 版本中,用户属于一个工作空间,每个工作空间包含页面。一些用户可能可以访问某些页面,而另一些用户可能无法访问。

页面可以表示如下

{
    "id": "477f110a-848a-4c23-969d-e7ff7a648c65",
    "workspace_id": "c3d3e966-60e2-4390-9d49-0a9d60f8f02d",
    "path": "/knowledge base/hello world",
    "title": "Hello World",
    "content": "#This is the first page",
    "can_view": [
        "ec6dfb90-2e89-4912-8e01-a25bb2a5a524",
        "b315c817-b3c4-4604-bd1f-122e5e452c91",
        "45c233cd-8160-4a38-8347-b13bc4709345",
        "ab58453d-6d56-496d-a5fa-ddb7c76b5a29",
        "d6de8463-5514-4bfe-90ba-471fbe9a23c6",
    ],
    "created_at": 1686512258,
    "updated_at": 1686512329,
}

can_view 属性是所有有权访问此页面的 user_id 的列表。

📖
了解如何在文档中更新您的设置

接下来,您需要创建一个 pages 索引并添加以下设置

{
    "displayedAttributes": [
        "id",
        "path",
        "title",
        "updated_at"
    ],
    "searchableAttributes": [
        "title",
        "content"
    ],
    "filterableAttributes": [
        "workspace_id",
        "can_view"
    ],
    "sortableAttributes": [
        "created_at",
        "updated_at"
    ]
}

以下是这些属性的简要说明

  • displayedAttributes: 在应用程序搜索结果中显示的属性。在本例中,我们显示页面 idpathtitleupdated_at
  • searchableAttributes: 可以搜索的属性。对于类似 Notion 的应用程序,页面的 titlecontent 将是最相关的
  • filterableAttributes: 这些是您可以过滤的属性。我们已经包含了 workspace_idcan_view,以根据工作空间和用户权限控制对页面的访问
  • sortableAttributes: 这些是您可以对搜索结果排序的属性。我们已经包含了 created_atupdated_at,以支持按创建和修改日期对页面进行排序

创建租户令牌

在您的 Meilisearch 配置就位后,下一步是为每个用户创建一个新的租户令牌。如果您没有特别的安全性问题,您可以省略到期日期以简化您的入职流程。

租户令牌的关键部分是 searchRules。在我们的示例中,您将添加以下规则

{
    "pages": {
        "filter": "workspace_id = c3d3e966-60e2-4390-9d49-0a9d60f8f02d && can_view = 45c233cd-8160-4a38-8347-b13bc4709345"
    }
}

使用生成的令牌,您的搜索将根据 workspace_idcan_view(用户 ID)限制访问,因此用户只能看到他们有权访问的页面。

将此令牌存储在您的主要数据存储区(Postgres、MySQL 等)中。这种机制类似于 Stripe 等工具中使用的机制。

每次用户登录您的应用程序时,将此密钥加载到本地存储中,并将其用于搜索,从而确保每个用户只能访问他们应该访问的数据。

💡
需要详细的逐步教程?探索我们深入的关于多租户的文章

总结

使用 Meilisearch 实现 RBAC 使您能够创建具有细粒度访问控制的应用程序,确保用户只能访问他们被允许查看的数据。通过遵循本指南,您可以提高应用程序的数据安全性和隐私性,同时为用户提供无缝的搜索体验。如果您有任何问题,您可以加入我们 Discord

祝您编码愉快!

有关 Meilisearch 的更多信息,请订阅我们的时事通讯。您可以查看我们的 路线图 并参与我们的产品讨论,以详细了解我们的产品。