为什么 authzed 没有获取这种递归关系?

问题描述 投票:0回答:2

我在授权架构和关系方面遇到问题。我似乎误解了事情的运作方式。

我有一个场景,其中用户可以通过直接包含或间接基于位置的标准成为组的一部分,位置是分层的,具有三个级别 - 国家/地区、州/省和城市。

也就是说, 威奇托、托皮卡或道奇城的任何人也在堪萨斯州 西雅图、塔科马或斯波坎的任何人都在华盛顿 堪萨斯州或华盛顿州的任何人都在美国 同样,任何在浦那的人也在马哈拉施特拉邦,任何在马哈拉施特拉邦的人也在印度

我构建了一个支持直接包含检测的架构(https://play.authzed.com/s/cBfN1HhtcoVE)。 我有一个名为 wichitans 的用户组。它(自然)包括 wichita org_unit 中的用户,以及位于西雅图但将在未来几个月内搬到 wichita 的用户 Samuel。

我使用权限名称“is_user_in_ex/implicits”只是为了了解我的分组是否正确。我可以在 Expected_relations 中看到 Samuel 在威奇托显式中,而 Wally 在威奇托隐式中,这正是我所期望的,就像 wally 在威奇托的子级中一样。


现在我对测试关系的第 22 行做了一个小更改 (https://play.authzed.com/s/zeYxryGzYbaK),这样我就不会将 Wichita 分配给隐式,而是将 Kansas 分配给隐式。 Samual 仍处于显式,威奇托仍处于隐式(因为它是堪萨斯州的子级),但沃利不再处于隐式。我假设会有递归评估,但情况似乎并非如此。是否有不同的运算符说“我希望这种关系是递归的”或者我是否需要更改一些模式定义?如果可能的话,我希望避免将组织单位分为三个不同的级别。

authorization spicedb zanzibar
2个回答
1
投票

在 SpiceDB 中,您可以非常字面地理解权限计算。在第一个模式中,块看起来像:

definition user_group {
    relation implicits : org_unit
    relation explicits : user

    permission is_user_in_implicits = implicits + implicits->children
    permission is_user_in_explicits = explicits
}

definition org_unit {
    relation parent: org_unit
    relation children: org_unit | user 
}

我们开始对

user_group
对象类型进行权限遍历。在计算
is_user_in_implicits
时,我们正在收集
implicits
的关系,其中仅包含关系:

user_group:wichitans#implicits@org_unit:kansas

然后,我们将其与

implicits->children
引用的对象(注意:我不是说用户)合并。其作用的伪代码可以写成:

for relationship in implicits:
  for child in relationship.subject.children:
    yield child

根据给定的相关

children
关系:

org_unit:kansas#children@org_unit:wichita

将产生主题

org_unit:wichita

没有进一步的指示供权限系统遵循或解决。

兄弟姐妹的回答中所述,解决此问题的一种方法是指向孩子的

permission
。通过将
is_user_in_implicits
放在
org_unit
user_group
上,无论
children
关系指向什么类型,我们都可以通过该权限进行解析。这称为“鸭子类型”,对于 Python 和 ruby 等编程语言应该很熟悉。

实现此目的的另一种方法是将

children
的类型设置为引用的不是组织单位本身,而是组织单位的子单位,如下所示:

definition user_group {
    relation implicits : org_unit#children
    relation explicits : user

    permission is_user_in_implicits = implicits + implicits->children
    permission is_user_in_explicits = explicits
}

definition org_unit {
    relation parent: org_unit
    relation children: org_unit#children | user 
}

这将要求您将关系上的

optional_subject
设置为
children
,但允许您提升是否递归下降到数据层的决定。

我更喜欢在可能的情况下明确说明何时递归下降。

您可以在以下博客文章中详细了解 SpiceDB 如何计算权限:


0
投票

在探索过程中,我发现如果我在组织单位上创建重复的权限“is_user_in_implicits”并选择组织单位的子项+组织单位子项的新“is_user_in_implicits”权限,则递归关系似乎会按预期工作,甚至达到美国的级别(此时它还选择西雅图、华盛顿和塞缪尔,但这就是我期望它工作的方式”。这是获得递归关系的正确方法吗?

https://play.authzed.com/s/ZcjmA_7_1Xg3/schema

© www.soinside.com 2019 - 2024. All rights reserved.