我目前正在构建自己的Openidm连接器,用于使用基于示例的Groovy框架连接器提供外部系统。
我正在实现searchScript.groovy文件,以便在目标系统上搜索资源(用户),并希望在请求中传递源系统的当前用户UID。
下面是SearchScript.groovy源代码:
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,名字,.但没有成功。
谢谢你的帮助
发布于 2015-03-24 19:07:53
要使SearchScript做的不仅仅是返回所有用户,您需要使用"filter“对象。您已经在脚本中声明了它,但是您没有使用它--这是一个对象,它包含连接器需要的所有细节,以便知道这个脚本应该在后端执行什么样的“搜索”(在本例中是通过REST )。过滤器对象本质上是树结构,它们的预期使用是基于“访客模式”。
您的代码所基于的scriptedrest2dj示例展示了CRESTFilterVisitor的使用,这是一个特别的示例,对于使用OpenDJ (该示例的目标)特别有用。对于更通用的访问者实现,我建议查看sample3 3的SearchScript.groovy。Sample3是使用service的一个示例,但显示的访问者可以用于生成任何类型的查询字符串(例如可能传递给REST服务的查询字符串)。
从sample3 3的过滤器代码中,返回一个表示筛选树的值的常规映射:
def query = filter.accept(MapFilterVisitor.INSTANCE, null)这是这张用于简单值的地图的结构。字段eq "value"):
[
"operation": "EQUALS|CONTAINS|STARTSWITH|ENDSWITH",
"not": "true|false",
"left": "fieldName",
"right": "value"
]这里的“左”和“右”可以看作方程的边。如果是:'Id“bob‘’左侧将是"Id”,而右边将是"bob“。“操作”将是“相等”。
这是用于更复杂表达式的结构(例如。simpleExpr和simpleExpr):
[
"operation": "AND|OR",
"left": "simpleExpression|complexExpression",
"right": "simpleExpression|complexExpression"
]正如您在这里看到的,您可以在这个映射结构中表示任意复杂的布尔表达式。根据您在特定情况下愿意支持的复杂程度,您可以选择支持一个完全递归的表达式生成器(如sample3中所示),也可以简单地支持核心案例。
下面是一些您的脚本应该能够处理的操作的示例:
GET /openidm/system/scriptedrest/account?_queryId=query-all-ids
GET /openidm/system/scriptedrest/account/bob
__UID__值的简单筛选器完全相同。实现这一目标的快速而肮脏的方法是将筛选器对象转换为映射(正如我所描述的),然后假设映射只包含搜索特定__UID__的筛选器,如下所示:
def uid = query.get('right')然后,您可以将它传递到REST调用中(可能通过将其附加到uri.path变量)。
理想情况下,搜索脚本应该能够处理更复杂的过滤器,如下所示:
GET /openidm/system/scriptedrest/account?_queryFilter=/email eq "bob@bob.com"
https://stackoverflow.com/questions/29168464
复制相似问题