首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openidm -连接器groovy脚本中的访问源或目标值

Openidm -连接器groovy脚本中的访问源或目标值
EN

Stack Overflow用户
提问于 2015-03-20 14:07:46
回答 1查看 1.6K关注 0票数 1

我目前正在构建自己的Openidm连接器,用于使用基于示例的Groovy框架连接器提供外部系统。

我正在实现searchScript.groovy文件,以便在目标系统上搜索资源(用户),并希望在请求中传递源系统的当前用户UID。

下面是SearchScript.groovy源代码:

代码语言:javascript
复制
import groovyx.net.http.RESTClient
import org.apache.http.client.HttpClient
import org.forgerock.openicf.connectors.scriptedrest.ScriptedRESTConfiguration
import org.forgerock.openicf.misc.scriptedcommon.OperationType
import org.identityconnectors.common.logging.Log
import org.identityconnectors.framework.common.objects.Attribute
import org.identityconnectors.framework.common.objects.AttributeUtil
import org.identityconnectors.framework.common.objects.Name
import org.identityconnectors.framework.common.objects.ObjectClass
import org.identityconnectors.framework.common.objects.OperationOptions
import org.identityconnectors.framework.common.objects.SearchResult
import org.identityconnectors.framework.common.objects.Uid
import org.identityconnectors.framework.common.objects.filter.Filter
import org.identityconnectors.framework.common.objects.AttributesAccessor

import static groovyx.net.http.Method.GET
import static groovyx.net.http.ContentType.JSON;

// imports used for CREST based REST APIs
import org.forgerock.openicf.misc.crest.CRESTFilterVisitor
import org.forgerock.openicf.misc.crest.VisitorParameter

def operation = operation as OperationType
def configuration = configuration as ScriptedRESTConfiguration
def httpClient = connection as HttpClient
def connection = customizedConnection as RESTClient
def filter = filter as Filter
def log = log as Log
def objectClass = objectClass as ObjectClass
def options = options as OperationOptions
def resultHandler = handler

log.info("Entering " + operation + " Script")

switch (objectClass) {
    case ObjectClass.ACCOUNT:
        // Search for a specific user in Alfresco
        // http://docs.alfresco.com/community/references/RESTful-PersonPersonGet.html
        def searchResult = connection.request(GET, JSON) { req ->
            uri.path = 'people'

            headers.Accept = 'application/json'

            response.success = { resp, json ->
                json.people.each() { value ->
                    resultHandler {
                        uid value.userName
                        id value.userName
                        attribute 'email', value?.email
                        attribute 'lastName', value?.lastName
                        attribute 'userName', value?.userName
                        attribute 'firstName', value?.firstName
                        attribute 'enabled', value?.enabled
                        //attribute ('groups', *(value?.groups))
                    }
                }
                json
            }
        }

        return new SearchResult(null, -1) // no remaining results
}

如何访问脚本中的源值?我有Uid,Id,名字,.但没有成功。

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-24 19:07:53

要使SearchScript做的不仅仅是返回所有用户,您需要使用"filter“对象。您已经在脚本中声明了它,但是您没有使用它--这是一个对象,它包含连接器需要的所有细节,以便知道这个脚本应该在后端执行什么样的“搜索”(在本例中是通过REST )。过滤器对象本质上是树结构,它们的预期使用是基于“访客模式”。

您的代码所基于的scriptedrest2dj示例展示了CRESTFilterVisitor的使用,这是一个特别的示例,对于使用OpenDJ (该示例的目标)特别有用。对于更通用的访问者实现,我建议查看sample3 3的SearchScript.groovy。Sample3是使用service的一个示例,但显示的访问者可以用于生成任何类型的查询字符串(例如可能传递给REST服务的查询字符串)。

从sample3 3的过滤器代码中,返回一个表示筛选树的值的常规映射:

代码语言:javascript
复制
def query = filter.accept(MapFilterVisitor.INSTANCE, null)

这是这张用于简单值的地图的结构。字段eq "value"):

代码语言:javascript
复制
[ 
    "operation": "EQUALS|CONTAINS|STARTSWITH|ENDSWITH",
    "not": "true|false",
    "left": "fieldName",
    "right": "value"
]

这里的“左”和“右”可以看作方程的边。如果是:'Id“bob‘’左侧将是"Id”,而右边将是"bob“。“操作”将是“相等”。

这是用于更复杂表达式的结构(例如。simpleExpr和simpleExpr):

代码语言:javascript
复制
[ 
    "operation": "AND|OR",
    "left": "simpleExpression|complexExpression",
    "right": "simpleExpression|complexExpression"
]

正如您在这里看到的,您可以在这个映射结构中表示任意复杂的布尔表达式。根据您在特定情况下愿意支持的复杂程度,您可以选择支持一个完全递归的表达式生成器(如sample3中所示),也可以简单地支持核心案例。

下面是一些您的脚本应该能够处理的操作的示例:

GET /openidm/system/scriptedrest/account?_queryId=query-all-ids

  • 这基本上就是你现在所拥有的。在执行此操作时," filter“对象将为空,因此您根本不需要过滤任何内容。

GET /openidm/system/scriptedrest/account/bob

  • 这是一个“读取”操作,但它也是通过SearchScript实现的。"Read“与特定__UID__值的简单筛选器完全相同。实现这一目标的快速而肮脏的方法是将筛选器对象转换为映射(正如我所描述的),然后假设映射只包含搜索特定__UID__的筛选器,如下所示: def uid = query.get('right')

然后,您可以将它传递到REST调用中(可能通过将其附加到uri.path变量)。

理想情况下,搜索脚本应该能够处理更复杂的过滤器,如下所示:

GET /openidm/system/scriptedrest/account?_queryFilter=/email eq "bob@bob.com"

  • 这是对具有特定值的记录的更一般的搜索。您的REST后端必须支持这样的东西,您的过滤器查询生成器必须能够遍历树,以便构建适当的查询字符串。取决于您需要对此连接器做什么,它可能是不必要的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29168464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档