SCIM 补丁库
SCIM PATCH library
我正在为我当前的项目实施 SCIM 配置,我正在尝试实施 PATCH 方法,但似乎并不那么容易。
我在 RFC 中读到的是 SCIM PATCH 几乎像 JSON PATCH,但是当我看得更深时,它在描述路径的方式上似乎有点不同,这不允许我使用 json-补丁程序库。
示例:
"path":"addresses[type eq \"work\"]"
"path":"members[value eq
\"2819c223-7f76-453a-919d-413861904646\"]"
你知道有哪个图书馆开箱即用地做 SCIM PATCH 吗?
我的项目目前是一个节点项目,但我不关心语言我可以根据需要在 javascript 中重写它。
编辑
我终于为此创建了自己的库,名为 scim-patch
,可在 npm https://www.npmjs.com/package/scim-patch
上找到
看看 scim2-filter-parser:https://github.com/15five/scim2-filter-parser
是作者的django-scim2库主要使用的库:https://github.com/15five/django-scim2
它依赖于 python AST 对象,但我认为你应该从那里得到一些收获。
我在自己的库中实现了SCIM PATCH操作。请看一下here and here。目前 v2 的工作正在进行中,但补丁操作所需的 CRUD 能力已经成熟。
首先,您需要一种解析 SCIM 路径的方法,它可以选择性地包含一个过滤器。我实现了一个有限状态机来解析路径和过滤器。扫描器将遍历文本的每个字节并指出有趣的事件,解析器将使用扫描器将文本分解为有意义的标记。例如,emails[value eq "foo@bar.com"].type
可以分解为 emails
、[
、eq
、"foo@bar.com"
、]
和 type
。最后,编译器会将这些标记输入 assemble 放入抽象语法树中。在纸面上,它将如下所示:
emails -> eq -> type
/ \
value "foo@bar.com"
接下来需要一种根据抽象语法树遍历资源数据结构的方法。我将 属性 模型设计为携带对 SCIM 属性的引用。考虑以下资源:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "imulab",
"emails": [
{
"value": "foo@bar.com",
"type": "work"
},
{
"value": "bar@foo.com",
"type": "home"
}
]
}
我从资源的根开始遍历并找到名为 emails
的子项,它将 return 复杂类型的多值 属性。我看到我的下一个标记 (eq
) 是过滤器的根,所以我对 emails
的两个元素执行过滤器操作。对于每个元素,我沿着 value
子元素向下并评估其值。由于只有第一个元素与过滤器匹配,我最终沿着该复合体 属性 的 type
子节点向下并到达目标 属性。从那里,您可以自由执行 Add
、Replace
和 Remove
操作。
我建议注意两件事。
一件事是,当您点击多值 属性 时,您的遍历路径将分裂。在上面的示例中,我们只有一个元素与过滤器匹配。实际上,我们可能有很多匹配,或者根本没有过滤器,迫使你遍历所有元素。
另一个是SCIM路径的语法。规范要求可以在实际路径前面加上模式 URN 前缀,并用 :
分隔它们。因此,在该表示中,emails.type
和 urn:ietf:params:scim:schemas:core:2.0:User:emails.type
是实际的等价物。请注意,架构 URN 在 2.0
部分包含点 (.
)。这造成了进一步的复杂化,现在您不能简单地用 .
分隔文本并希望获得所有正确的标记。我使用 Trie 数据结构将所有模式 URN 记录为 保留字 。每当我在路径中开始一个新段时,我都会尝试在 Trie 中匹配它,而不是仅仅依靠 .
来终止段。
希望对您的工作有所帮助。
由于没有找到实现scim补丁操作的typescript库,所以自己实现了库
您可以在这里找到它:https://www.npmjs.com/package/scim-patch
我正在为我当前的项目实施 SCIM 配置,我正在尝试实施 PATCH 方法,但似乎并不那么容易。
我在 RFC 中读到的是 SCIM PATCH 几乎像 JSON PATCH,但是当我看得更深时,它在描述路径的方式上似乎有点不同,这不允许我使用 json-补丁程序库。
示例:
"path":"addresses[type eq \"work\"]"
"path":"members[value eq
\"2819c223-7f76-453a-919d-413861904646\"]"
你知道有哪个图书馆开箱即用地做 SCIM PATCH 吗? 我的项目目前是一个节点项目,但我不关心语言我可以根据需要在 javascript 中重写它。
编辑
我终于为此创建了自己的库,名为 scim-patch
,可在 npm https://www.npmjs.com/package/scim-patch
看看 scim2-filter-parser:https://github.com/15five/scim2-filter-parser
是作者的django-scim2库主要使用的库:https://github.com/15five/django-scim2
它依赖于 python AST 对象,但我认为你应该从那里得到一些收获。
我在自己的库中实现了SCIM PATCH操作。请看一下here and here。目前 v2 的工作正在进行中,但补丁操作所需的 CRUD 能力已经成熟。
首先,您需要一种解析 SCIM 路径的方法,它可以选择性地包含一个过滤器。我实现了一个有限状态机来解析路径和过滤器。扫描器将遍历文本的每个字节并指出有趣的事件,解析器将使用扫描器将文本分解为有意义的标记。例如,emails[value eq "foo@bar.com"].type
可以分解为 emails
、[
、eq
、"foo@bar.com"
、]
和 type
。最后,编译器会将这些标记输入 assemble 放入抽象语法树中。在纸面上,它将如下所示:
emails -> eq -> type
/ \
value "foo@bar.com"
接下来需要一种根据抽象语法树遍历资源数据结构的方法。我将 属性 模型设计为携带对 SCIM 属性的引用。考虑以下资源:
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "imulab",
"emails": [
{
"value": "foo@bar.com",
"type": "work"
},
{
"value": "bar@foo.com",
"type": "home"
}
]
}
我从资源的根开始遍历并找到名为 emails
的子项,它将 return 复杂类型的多值 属性。我看到我的下一个标记 (eq
) 是过滤器的根,所以我对 emails
的两个元素执行过滤器操作。对于每个元素,我沿着 value
子元素向下并评估其值。由于只有第一个元素与过滤器匹配,我最终沿着该复合体 属性 的 type
子节点向下并到达目标 属性。从那里,您可以自由执行 Add
、Replace
和 Remove
操作。
我建议注意两件事。
一件事是,当您点击多值 属性 时,您的遍历路径将分裂。在上面的示例中,我们只有一个元素与过滤器匹配。实际上,我们可能有很多匹配,或者根本没有过滤器,迫使你遍历所有元素。
另一个是SCIM路径的语法。规范要求可以在实际路径前面加上模式 URN 前缀,并用 :
分隔它们。因此,在该表示中,emails.type
和 urn:ietf:params:scim:schemas:core:2.0:User:emails.type
是实际的等价物。请注意,架构 URN 在 2.0
部分包含点 (.
)。这造成了进一步的复杂化,现在您不能简单地用 .
分隔文本并希望获得所有正确的标记。我使用 Trie 数据结构将所有模式 URN 记录为 保留字 。每当我在路径中开始一个新段时,我都会尝试在 Trie 中匹配它,而不是仅仅依靠 .
来终止段。
希望对您的工作有所帮助。
由于没有找到实现scim补丁操作的typescript库,所以自己实现了库
您可以在这里找到它:https://www.npmjs.com/package/scim-patch