Edge Server权限指南 - 预览
Edge Server数据访问受以下方面的交集控制:
基于角色的权限
用户身份验证
用于将数据同步到Edge Server实例的查询
如果使用Atlas Device SDK ,则用于与客户端同步数据的查询
Edge Server支持文档和字段级别基于角色的权限。 本页探讨高级Edge Server和客户端权限配置,并提供示例说明基本权限原则。
相关文档:
如果您不熟悉 Atlas 中基于角色的权限,请在基于角色的权限中了解权限引擎的概述。
有关如何定义角色和权限的信息,请参阅定义角色和权限。
Edge Server使用Device Sync在Edge Server实例和Atlas之间同步数据。 Edge Server和客户端角色必须使用与Device Sync兼容的权限。
Edge Server权限
Edge Server实例是一个用户,类似于其他传入客户端连接。 Edge Server必须通过Atlas进行身份验证,并且它有自己的权限来确定实例可以读写哪些数据。
您可以配置规则,使其普遍应用服务中的所有边缘服务器。 或者,您可以使用更精细的规则来指定Edge Server实例可以写入的数据子集。
所有边缘服务器
您可以通过指定Edge Server applyWhen
规则表达式 (其中 %%user_type 为 )来创建适用于所有edge
实例的角色:
{ "name": "edgeServerRole", "apply_when": { "%%user.type": "edge" }, ...customize the permissions for all Edge Server instances... }
示例,如果您的数据集不包含敏感数据(例如天气服务),您可以添加一个角色,声明边缘服务器可以读取和写入所有数据:
{ "name": "readAndWriteAll", "apply_when": { "%%user.type": "edge" }, "document_filters": { "read": true, "write": true }, "insert": true, "delete": true, "search": true, "read": true, "write": true }
特定Edge Server
在某些情况下,业务逻辑意味着您只想将数据的子集同步到给定的Edge Server实例。 示例,在以下情况下,您可能希望将Edge Server限制为数据的子集:
数据集包含 PII 或其他敏感数据,不应同步到每个Edge Server实例
这是一个大型数据集,您不想将其同步到资源有限的设备
Edge Server托管是不可信硬件,应具有完成任务所需的最少数据
出于法律或监管目的,数据受到地区限制,并且您只想同步与Edge Server地区相关的数据
您可以使用权限来筛选特定实例对数据子集的访问权限。 或者,您可以使用权限将Edge Server实例配置为读取数据,但不能写入数据。
由于每个Edge Server实例都是一个用户,因此您可以使用Edge Server的 user_id
为给定实例配置权限。 您可以使用Edge Server 规则表达式 创建一个角色,以限制与特定 实例同步的数据,其中 %%user_id 是 的Edge Server user_id
。您可以从Edge Server user_id
Edge Server实例详细信息 或 AdminAPI 列表边缘服务器 端点获取 实例 。
读/写自己的文档
您可以使用 user_id
将Edge Server实例限制为只能读取和写入自己的文档。
例如,如果Edge Server实例代表医疗保健诊所,您可能只想同步与该诊所患者相关的数据。
在此示例中,每个文档都有一个 facility_id
属性,其值为Edge Server的 user_id
。 此角色意味着Edge Server只能读取和写入 facility_id
与其自身 user_id
匹配的文档。
{ "name": "facilityItemsOnly", "apply_when": { "%%user.type": "edge" }, "document_filters": { "write": { "facility_id": "%%user.id" }, "read": { "facility_id": "%%user.id" }, }, "read": true, "write": true, "insert": true, "delete": true, "search": true }
读取全部,写入自己的文档
您可以将Edge Server实例配置为能够读取所有数据,但只能写入自己的数据。 例如,在零售环境中, Edge Server实例可能代表商店库存系统。 您可能希望商店能够在所有库存中Atlas Search某一商品,但只销售自己库存中的商品。
{ "name": "readAllWriteOnlyStoreItems", "apply_when": { "%%user.type": "edge" }, "document_filters": { "write": { "store_id": "%%user.id" }, "read": true }, "read": true, "write": true, "insert": true, "delete": true, "search": true }
客户端权限
连接到Edge Server实例的客户端具有自己的权限。 您可以将Edge Server实例的权限视为Atlas中的数据与客户端可写入数据之间的过滤。
在类似于上述边缘服务器实例示例的医疗保健环境中,边缘Edge Server实例只能读取和写入与其自身设施相关的数据。 然后,第二个角色可以进一步限制连接客户端的权限。 例如,机构中的患者只能查看自己的数据。
您可以在roles
数组中将这些角色表示为独立的角色。
规则引擎会按照您指定角色的顺序对每个角色的apply_when
表达式求值。 第一个apply_when
表达式计算结果为true
的角色将成为分配的角色。 如果没有角色匹配,则拒绝访问权限。
在此示例中, PatientRecords
数据库具有Visits
集合。 这两个角色决定了Edge Server实例可以同步哪些文档,以及连接到该实例的单个客户端可以同步哪些文档:
facilityItemsOnly
角色筛选同步到Edge Server实例的项目。 同步到设施的唯一项目是facility_id
与Edge Server实例user_id
匹配的记录。patientOwnRecordsOnly
角色筛选可同步到已连接客户端设备的项目。 唯一同步到已连接客户端的项目是其中patient_id
为客户端user_id
的访问。
{ "collection": "Visits", "database": "PatientRecords", "roles": [ { "name": "facilityItemsOnly", "apply_when": { "%%user.type": "edge" }, "document_filters": { "write": { "facility_id": "%%user.id" }, "read": { "facility_id": "%%user.id" }, }, "insert": true, "delete": true, "search": true, "read": true, "write": true }, { "name": "patientOwnRecordsOnly", "apply_when": {}, "document_filters": { "write": { "patient_id": "%%user.id" }, "read": { "patient_id": "%%user.id" } }, "read": true, "write": true, "insert": true, "delete": true, "search": true } ] }
重要
角色顺序很重要
在此示例中,roles
大量中的第一项是Edge Server角色,其 apply_when
表达式仅适用于Edge Server 。 当客户端评估角色时,第一个角色的客户端端评估结果为false
,因此它会继续执行下一个角色。 如果第一个条目是客户端角色,且 apply_when
表达式为空,则对于Edge Server ,该角色的计算结果为 true
。 由于Edge Server的 user_id
永远不会与 patient_id
匹配,因此没有文档会同步到Edge Server 。
如果您有许多不同类型的客户端,并且每个客户端都有权访问权限数据的子集,则可以定义许多不同的客户端角色。 示例,在医疗保健环境中,您可以使用不同的角色:
患者:仅访问权限自己的医疗记录和解决账单信息。
账单专家:提供对所有患者地址和账单信息的访问权限,但不包括医疗记录。
医生:提供所有患者医疗记录的访问权限,但不提供地址和账单信息。
字段级权限
Edge Server还支持字段级权限,从而确定对文档中特定字段的读取或写入访问权限。 您可以为Edge Server实例、连接到Edge Server实例的客户端或两者定义字段级权限。