2

我正在为我当前的项目实施 SCIM 配置,并且我正在尝试实施 PATCH 方法,这似乎并不容易。

我在RFC中读到的是 SCIM PATCH 几乎就像 JSON PATCH,但是当我深入研究时,路径的描述方式似乎有点不同,这不允许我使用 json-patch 库。

例子:

"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上找到

4

3 回答 3

1

我在自己的库中实现 SCIM PATCH 操作。请看这里这里。目前 v2 正在进行中,但补丁操作所需的 CRUD 能力已经成熟。

首先,您需要一种解析 SCIM 路径的方法,该路径可以选择包含一个过滤器。我实现了一个有限状态机来解析路径和过滤器。扫描器将遍历文本的每个字节并指出有趣的事件,解析器将使用扫描器将文本分解为有意义的标记。例如,可以emails[value eq "foo@bar.com"].type分解为emails[eq"foo@bar.com"和。最后,编译器将获取这些标记输入并将其组装成抽象语法树。在纸面上,它将如下所示:]type

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项,它将返回一个复杂类型的多值属性。我看到我的下一个标记 ( eq) 是过滤器的根,所以我对 的两个元素执行过滤操作emails。对于每个元素,我会沿着value子元素向下并评估它的值。由于只有第一个元素与过滤器匹配,所以我最终沿着该type复杂属性的子元素向下到达目标属性。从那里,您可以自由地执行和Add操作。ReplaceRemove

我建议注意两件事。

一件事是,当您点击 multiValued 属性时,您遍历的路径将分裂。在上面的示例中,我们只有一个与过滤器匹配的元素。实际上,我们可能有很多匹配项,或者根本没有过滤器,迫使您遍历所有元素。

另一个是 SCIM 路径的语法。规范要求可以在实际路径前面添加模式 URN 前缀并用:. 所以在那个表示中,emails.type并且urn:ietf:params:scim:schemas:core:2.0:User:emails.type是实际的等价物。请注意,模式 URN.在部分中包含点 ( ) 2.0。这造成了进一步的复杂性,现在您不能简单地分隔文本.并希望获得所有正确的标记。我使用 Trie 数据结构将所有模式 URN 记录为保留字。每当我在路径中开始一个新的段时,我都会尝试在 Trie 中匹配它,而不是仅仅依靠.终止该段。

希望对您的工作有所帮助。

于 2019-12-06T20:20:29.313 回答
0

由于我没有找到任何 typescript 库来实现 scim 补丁操作,所以我实现了自己的库。

你可以在这里找到它:https ://www.npmjs.com/package/scim-patch

于 2021-11-05T14:24:03.577 回答
0

看看 scim2-filter-parser:https ://github.com/15five/scim2-filter-parser

它是作者的 django-scim2 库主要使用的库:https ://github.com/15five/django-scim2

它依赖于 python AST 对象,但我认为你应该从那里得到一些收获。

于 2019-11-29T07:44:05.350 回答