ibm报表数据源适配器出错_为IBM Security Identity Manager构建新的适配器

ibm报表数据源适配器出错

适配器是将IBM Security Identity Manager连接到它管理的系统的组件。 作为开发人员或管理员,您可能需要编写适配器以将IBM Security Identity Manager与不受支持的应用程序或服务(例如定制应用程序)连接。 然后,您可以使用IBM Security Identity Manager来配置,修改,取消供应和列出该系统上的现有帐户。

在本文中,我介绍了一种构建适配器的简单技术。 使用IBM Tivoli Directory Integrator,我逐步完成了将适配器配置为LDAP服务器的过程,然后将其用于通过IBM Security Identity Manager添加,协调,修改和删除新的用户帐户。

要遵循本文中的练习,您应该具有使用IBM Security Identity Manager和IBM Tivoli Directory Integrator的经验。 您还应该熟悉轻量级目录访问协议和基本JavaScript编程。

建筑适配器

有几种方法可以实现在IBM Security Identity Manager中使用的新适配器:

  1. 您可以通过编写实现com.ibm.itim.remoteservices.provider.ServiceProviderFactory接口的类,以Java™代码构建适配器。 请在运行IBM Security Identity Manager的任何计算机上查看/opt/IBM/isim/extensions/6.0/examples/serviceprovider/Readme.html,以了解有关此方法的更多信息。
  2. 您可以使用IBM适配器开发工具(ADT),该工具可从IBM Open Process Automation库获得(请参阅参考资料中的链接)。
  3. 您可以使用IBM Tivoli Directory Integrator来模拟LDAP服务器实现。 LDAP服务器用于处理帐户信息,因此它们支持适配器所需的所有功能。

本文中的演示基于LDAP服务器实现。 如果您尚未在开发或管理环境中设置IBM Security Identity Manager,请参阅参考资料立即下载并安装它。

LDAP服务器适配器

本文的演示适配器充当IBM Tivoli Directory Integrator中实现的LDAP服务器。 图1显示了此类适配器的数据流示意图。

图1.数据流示意图
LDAP服务器适配器实现的数据流示意图。

请求是在IBM Security Identity Manager中生成的,IBM Security Identity Manager在IBM WebSphere Application Server中作为应用程序运行。 这些请求被发送到远程方法调用(RMI)调度程序,该调度程序是在IBM Tivoli Directory Integrator内部运行的AssemblyLine。 当您ITIMAd start发出ITIMAd start时,该过程即开始。 请注意,此数据流与其他无代理适配器(例如Linux®适配器或IBM Security Access Manager适配器)中使用的数据流相同。

然后,RMI调度程序使用LDAP与LDAP服务器通信,该LDAP服务器实际上是在单独的IBM Tivoli Directory Integrator实例中运行的AssemblyLine。 该组装流水线使用IBM Tivoli Directory Integrator的许多连接器中的任何一个在托管系统上设置,修改和删除帐户。

创建LDAP服务器AssemblyLine

创建新适配器框架的第一步是配置LDAP服务器AssemblyLine,我将按照以下步骤进行操作:

  1. 如以下代码所示,运行IBM Tivoli Directory Integrator(确保它使用的是与RMI调度程序ITIMAd不同的API端口):
    /opt/IBM/TDI/V7.1.1/ibmditk &
  2. 选择创建Tivoli Directory Integrator项目
  3. 将项目命名为LDAPServerAdapter
  4. 右键单击LDAPServer Project> AssemblyLines,然后选择New AssemblyLine
  5. 将新的AssemblyLine LDAPListener
  6. 单击添加组件 。 在服务器模式下创建LDAP服务器连接连接器。 单击下一步
  7. 选择当前未使用的端口,例如12345。
  8. 点击完成
  9. 在“ 输入映射”选项卡中,选择所有属性。
  10. 添加一个转储工作条目的脚本。
  11. 启动新的AssemblyLine。

创建测试服务

接下来,我将为适配器创建一个测试服务。 然后,我将能够使用测试服务来添加,修改和删除用户帐户。

  1. 以管理用户身份登录到IBM Security Identity Manager。
  2. 创建具有表1中显示的属性的LDAP配置文件服务。
表1. LDAP概要文件服务的属性
属性
服务名称 TestService
目录服务器位置 ldap://localhost:12345
管理员名称 cn=root
密码 whatever

注意:目录服务器位置应该是到达LDAP服务器所需的主机名和端口。

  1. 单击测试连接 。 它将失败,但是看到请求已中继到IBM Tivoli Directory Integrator控制台,如图2所示。
    图2.来自测试连接的请求
    IBM Tivoli Directory Integrator控制台中的请求的屏幕快照。
  2. 单击下一步
  3. 将用户基本DN指定为ou=users ,并将组基本DN指定为ou=groups
  4. 点击完成

而已。 您已经将新适配器构建为LDAP服务器实现,但是它什么都没做。 在下一部分中,我将通过使用适配器在IBM Security Identity Manager和目标系统之间添加,协调,删除和修改用户帐户来进行一些练习。

添加请求

实施最简单的LDAP服务器请求是添加请求。 首先,将一个新的用户帐户添加到测试服务,然后为新请求创建一个分支。

尝试为新服务的用户请求一个帐户。 由请求创建的工作对象应该类似于图3中的窗口。

图3.在TestService中发出添加请求
测试服务中添加请求的屏幕截图。

您应该在IBM Security Identity Manager控制台中看到,尽管没有响应,但是该请求被认为是成功的。

接下来,尝试为添加请求添加分支:

  1. 在IBM Tivoli Directory Integrator中停止AssemblyLine。
  2. 根据工作属性添加一个开关,然后选择ldap.operation ,如下所示:
    • 单击添加组件
    • 选择开关 ,保留默认名称,然后单击完成
    • 选择工作属性
    • 选择属性ldap.operation
  3. 添加的情况下, add (点击添加Case组件,类型add ,然后单击确定 )。
  4. 在这种情况下,添加AttributeMap
  5. 在表2中添加映射,以从LDAP请求中读取uidsncn值。
    表2.属性映射的变量
    工作属性 分配
    cn work["ldap.entry"].getValue(0).cn
    sn work["ldap.entry"].getValue(0).sn
    uid work["ldap.entry"].getValue(0).uid
  6. 现在,将SWITCH组件拖动到DumpWorkEntry组件上方,如图4所示。
    图4.带有添加操作的AssemblyLine
    带有添加操作的AssemblyLine的屏幕截图。
  7. 运行组装流水线。
  8. 现在运行以下命令以添加条目。 确保在条目末尾键入一个空行。 使用Ctrl-C退出。
    ldapadd -h localhost -p 12345 -x
    dn: uid=test,ou=users
    uid: test
    sn: Est
    cn: Tom Est
    objectClass: inetOrgPerson
  9. 看到新条目包括uidsncn ,如图5所示。
    图5.带有来自LDAP的属性的条目
    具有LDAP属性的新条目的屏幕截图。

向数据库添加新条目

接下来,我将创建一个数据库表并向其中添加条目。 在将新条目添加到DB2表之前,需要创建它。

  1. 运行以下命令创建表:
    db2
    CREATE DATABASE adapter
    CONNECT TO adapter
    CREATE TABLE accts(uid VARCHAR(10), cn VARCHAR(30))
    quit
  2. 在“ 案例:添加分支”中,单击“ 添加组件 ”。
  3. 选择数据库连接器(JDBC) ,将连接器命名为addEntry ,将模式设置为AddOnly ,然后单击完成
  4. 将新的连接器拖到属性映射之后,如图6所示。
    图6.带有addEntry的AssemblyLine
    带有addEntry的AssemblyLine的屏幕截图
  5. 单击连接器的“ 连接”选项卡。
  6. 选择数据库类型DB2
  7. 键入主机名localhost (或运行DB2的服务器),端口号(通常为50000 )和数据库名称adapter 。 (如果端口错误,请使用grep db2 /etc/services查看给定系统上DB2使用的端口号。)
  8. 输入数据库的用户凭据(例如, rootobject00 )。
  9. 单击“ 选择”以获取数据库表的列表,然后选择“ ACCTS”
  10. 单击输出映射选项卡。
  11. 单击连接 。 模式属性应出现。
  12. 单击添加,然后将work.cn映射到cn并将work.uiduid 。 ( 请注意,在这些情况下大小写无关紧要: work.CNwork.cn相同。 )

您已经配置了数据库适配器。 现在通过添加新帐户进行测试:

  1. 运行组装流水线。
  2. 尝试在IBM Security Identity Manager中向TestService设置帐户。
  3. 请参阅IBM Tivoli Directory Integrator控制台日志中的请求。
  4. 运行以下命令以验证该帐户已添加到数据库:
    db2 CONNECT TO adapter
    db SELECT cn,uid FROM accts
  5. 您应该看到如图7所示的输出。
    图7.添加到数据库的用户
    将新用户添加到数据库的输出。

和解

调节是确保服务中的用户帐户与IBM Security Identity Manager中的帐户记录匹配的过程。 为了使对帐有效,该服务必须能够响应搜索请求。

首先尝试与您的测试服务进行对帐。 它将失败,但是您将看到必须进行处理才能使对帐生效的搜索请求。 尝试将导致以下窗口中显示三个搜索请求:

图8.用户搜索
用户搜索的屏幕截图。
图9.组织单位搜索
组织用户搜索的屏幕截图。
图10.组搜索
群组搜索的屏幕截图。

测试服务必须能够以结果响应用户搜索请求。 对于其他两个请求,我可以发送一个空答复。

搜索分支

我需要做的第一件事是创建一个搜索分支,如下所示:

  1. 在IBM Tivoli Directory Integrator中停止AssemblyLine。
  2. SWITCH中添加search用例:{work.ldap.operation}
  3. search的情况下,添加IF组件。
  4. 设置条件 ,如表3和图11所示:
    表3.分支属性
    属性 操作员 区分大小写
    ldap.searchfilter 明确 equals (objectclass=inetOrgPerson) 明确
    图11.搜索分支的条件
    搜索分支条件的屏幕截图。
  5. 在分支内,创建一个Connector Loop 。 将其forEachUser
  6. 在循环中,创建一个脚本以将用户信息发送回LDAP客户端。 现在,AssemblyLine看起来应该如图12所示。
    图12.带有添加和搜索操作的AssemblyLine
    具有添加和搜索操作的AssemblyLine的屏幕截图。

接下来,我将创建一个循环以遍历数据库中的用户。 这里的许多步骤与我之前将数据库连接到add分支所遵循的步骤相同。

  1. 选择显示在AssemblyLine中的FOR-EACH forEachUser组件。
  2. 单击ibmdi.FileSystem将继承更改为Database Connector(JDBC)
  3. 单击连接选项卡。
  4. 选择DB2的数据库类型。
  5. 键入主机名localhost (或使用运行DB2的服务器),端口号50000和数据库adapter 。 (如果端口错误,请使用grep db2 /etc/services查看数据库系统上DB2使用的端口号。)
  6. 输入数据库的用户凭据(例如, rootobject00 )。
  7. 单击“ 选择”以获取数据库表的列表,然后选择“ ACCTS”
  8. 单击输入映射选项卡。
  9. 单击连接
  10. CNUID拖动到工作输入区域。

最后,我将使用脚本将用户发送到LDAP服务器连接器。

通过清单1中的脚本来修改FOR-EACH组件中的脚本。

清单1. FOR-EACH循环中的脚本
// Create a new Entry object. This is the same class as the work and conn
// objects of IBM Tivoli Directory Integrator
usr = new com.ibm.di.entry.Entry();

// Add the attribute for the distinguished name, $dn
usr.addAttributeValue("$dn", "uid=" + work.uid + ",ou=users");

// To create a multi-value attribute, such as objectClass, add several
// attribute values to the same attribute name
usr.addAttributeValue("objectClass", "inetOrgPerson");
usr.addAttributeValue("objectClass", "organizationalPerson");
usr.addAttributeValue("objectClass", "person");
usr.addAttributeValue("objectClass", "top");
usr.addAttributeValue("sn", "Not Implemented");
usr.addAttributeValue("cn", work.cn);
usr.addAttributeValue("uid", work.uid);

// The userpassword attribute is necessary to mark the account as
// active rather than suspended
usr.addAttributeValue("userpassword", "active");

// Send the finished Entry to the LDAP Server connector, 
// LDAPServerConnector
LDAPServerConnector.getConnector().putEntry(usr);

测试搜索操作

我将以对帐结束测试搜索功能。

  1. 运行以下命令以创建更多要协调的帐户:
    db2
    CONNECT TO adapter
    INSERT INTO accts(uid,cn) VALUES ('test','Tom Est')
    INSERT INTO accts(uid,cn) VALUES ('jdoe','Jane Doe')
    quit
  2. 运行组装流水线。
  3. 运行ldapsearch并看到您拥有所有用户。 在一行上全部键入以下命令:
    ldapsearch -x -h localhost -p 12345 objectclass=inetOrgPerson
  4. ldapsearch其他过滤器再次运行ldapsearch ; 请注意,您不会获得任何结果。
  5. 现在,尝试运行完全对帐并查看它是否有效。

删除要求

在本部分中,我将研究IBM Security Identity Manager与AssemblyLine之间的删除请求。 您会发现,删除用户帐户不只是发出请求而已。

首先使用IBM Security Identity Manager删除帐户。 该请求将在测试服务上失败,从而导致错误消息,如图13所示。

图13.删除失败
错误消息的屏幕截图。

让我们调查发生了什么。 首先,检查组装流水线的控制台日志以查看IBM Security Identity Manager尝试验证该帐户:

图14.验证帐户的请求
AssemblyLine控制台日志的屏幕截图。

如您所见,上一个请求使用了过滤器( &(uid =< user id >)( objectclass = inetorperson ))

请注意,在IBM Security Identity Manager甚至可以尝试发出删除请求之前,组装流水线必须能够响应这种单独的搜索请求。

响应单个搜索请求

要响应单个搜索请求,请使用正则表达式查找包含( uid =< uid > )条件的那些请求。

  1. CASE:search中 ,创建一个ELSE-IF组件。
  2. 创建表4中所示的条件:
    表4.识别单个条目请求的条件
    属性 操作员 区分大小写
    ldap.searchfilter 明确 包含 (uid= 已选
  3. ELSE-IF分支中创建一个属性映射。 在该属性图中,创建一个属性uid其值是使用清单2中的脚本计算的。
    清单2.过滤器中的UID属性
    // This is to identify the UID in filters of the type
    // (&(uid=<UID>)(objectclass=inetorgperson))
    
    // Convert the attribute ldap.searchfilter to a string.
    // The simple notation work.ldap.searchfilter does not
    // work here because it would look for the ldap attribute
    // in the work object, which does not exist.
    var filter = work["ldap.searchfilter"].toString();
    
    // Remove everything prior to the UID
    var nohead = filter.replace(/.*uid=/, "");
    
    // The UID will always be followed by a close parenthesis.
    // Remove it and everything after it.
    var notail = nohead.replace(/\).*/, "");
    
    return notail;
  4. 使用以下参数在属性映射下创建一个新连接器:
    表5.新连接器的属性
    属性
    组件名称 数据库连接器(JDBC)
    名称 readUser
    模式 抬头
    数据库类型 DB2
    主机名 localhost1
    港口 50000
    数据库 adapter
    用户名 示例: root
    密码 示例: object00
    表名 培训中心
    请注意,表5显示了我系统上的值。 输入数据库服务器,端口号和帐户的数据。
  5. 接下来,确保连接器在正确的位置:
    图15. AssemblyLine中的数据库查找连接器
    屏幕快照显示了AssemblyLine中的数据库查找连接器。
  6. 单击连接器的“ 输入映射”选项卡。
  7. 单击“ 连接”以验证数据库配置并读取架构。
  8. CN拖动到工作属性区域。
  9. 单击链接条件选项卡。
  10. 创建以下条件:
    UID equals $uid
  11. 现在打开“ 挂钩”选项卡。
  12. 选择“数据流(查找)”>“查找”>“不匹配时”
  13. 键入以下脚本以在不匹配的情况下发送空响应:
    LDAPServerConnector.reply(new com.ibm.di.entry.Entry());
  14. 复制sendUser并将其粘贴到新分支中:
    图16.在两个地方带有sendUser脚本的AssemblyLine
    带有两个sendUser脚本的AssemblyLine的屏幕快照。
  15. 运行组装流水线。
  16. 从命令行搜索用户信息:
    ldapsearch -x -h localhost -p 12345 uid=jdoe

现在尝试再次删除一个帐户。 如您在图17和图18中看到的,仍然有两个未处理的请求:

图17.一个新的删除请求
新删除请求的屏幕截图。
图18.搜索包含已删除帐户的组
搜索包含已删除帐户的组的屏幕截图。

处理删除请求

下一步是处理在图17中看到的删除请求。

  1. 单击切换:{work.ldap.operation}
  2. 单击添加案例组件并添加delete
  3. 在“ 案例:删除”分支中创建一个属性映射。 在该属性图中,创建一个属性uid其值是使用清单3中的脚本计算的。
    清单3. CASE:delete分支
    // Convert the attribute ldap.dn to a string.
    var dn = work["ldap.dn"][0].toString();
    
    // Remove everything prior to the UID
    var nohead = dn.replace(/uid=/, "");
    
    // The UID will always be followed by a comma.
    // Remove it and everything after it.
    var notail = nohead.replace(/,ou=users/, "");
    
    return notail;
  4. 右键单击ReadUser,然后选择重用连接器
  5. 将新连接器DeleteUser
  6. DeleteUser拖到属性图下方的CASE:delete分支中。
  7. 单击DeleteUser并将模式更改为Delete 。 图19显示了AssemblyLine现在的外观:
    图19.带有新删除操作的AssemblyLine
    具有新删除操作的AssemblyLine的屏幕快照。
  8. 运行组装流水线。
  9. 使用以下命令查看数据库中的用户列表:
    db2 connect to adapter
    db2 select cn,uid from accts
  10. 在IBM Security Identity Manager中删除帐户。
  11. 检查以确保该帐户实际上已被删除:
    db2 select cn,uid from accts

修改要求

在本部分中,我将向组装流水线添加必要的组件以实现修改请求。

  1. 尝试修改帐户的全名( cn )。 如您所见,有两个请求。 第一个是搜索用户信息,我已经处理过了。 第二个是修改请求本身,如图20所示。
    图20.修改请求
    修改请求的屏幕截图。
  2. 创建一个modify使用用于创建以前的分支同样的程序分支。
  3. DN获取UID的机制与delete分支中的机制相同。 右键单击属性映射以将其复制,然后将其粘贴到modify分支中。
  4. 创建清单4中所示的名为getLDAPAttrs的新脚本。
    清单4. getLDAPAttrs
    // The ldap.entry attribute always has one child, which is itself an Entry
    // object.
    var value = work["ldap.entry"].getFirstChild().getValue();
    
    // The attribute names of that Entry are the attributes that are being 
    // modified.
    var attrnames = value.getAttributeNames();
    
    for (i = 0; i < attrnames.length; i++) {
            var attr = value.getAttribute(attrnames[i]);
            var attrName = attr.getName();
            task.logmsg(attrName);
            for (j = 0; j < attr.size(); j+=2) {
            
                    // The attribute values are in pairs. The first
                    // item in the air is the operation (add, delete, and
                    // so on) and the second is the value on which the
                    // operation is applied.
                    var oper = attr.getValue(j);
                    var val = attr.getValue(j+1)
                    task.logmsg("\t" + oper + "->" + val);
                    
                    // The values that are added are the relevant ones
                    if (oper == "add") {
                            work.addAttributeValue(attrName, val);
                    }
            }
    }
  5. 重用deleteUser连接器,调用拷贝modifyUser ,将它拖到底部modify分支和模式改变为更新 。 现在,AssemblyLine应该看起来如图21所示。
    图21.带有Modify分支的AssemblyLine
    带有Modify分支的AssemblyLine的屏幕截图。
  6. 单击ModifyUser连接器的“ 输出映射”
  7. 单击添加,然后选择cn属性。
  8. 运行组装流水线,尝试修改测试服务上帐户的全名。 看到更改传播到数据库。

修改用户表格

到目前为止,我一直在使用标准的LDAP用户表单。 但是,一个更加用户友好的系统将仅显示我实际使用的字段,并将其标记为适合给定的服务类型。 在本节中,您将学习如何为给定的服务类型修改用户表单。

注意:从6.0版开始,有一个更简单的解决方案,由Miroslav Mandic找到。 您可以将服务类型保留为LdapProfile,然后编辑单个服务的形式。 有关详细信息,请参阅此页面底部的读者评论部分。

第一步是创建一个新的服务类型:

  1. 创建一个新目录并切换到新目录。
    mkdir ~/new_adapter
    cd ~/new_adapter
  2. 如图所示,打开LDAP适配器:
    jar xvf /opt/IBM/isim/config/adapters/LdapProfile.jar
  3. 使用以下配置文件信息重命名目录:
    mv LdapProfile TestProfile
  4. 重命名用户表单:
    mv TestProfile/erLDAPUserAccount.xml \
    TestProfile/erTestUserAccount.xml
  5. 现在,按如下所示编辑TestProfile/service.def文件:
    • 在第3行上,将名称从LdapProfile更改为TestProfile
    • 在第5行上,将配置文件从LdapProfile更改为TestProfile
    • 在第11行上,将名称从erLDAPUserAccount更改为erTestAccount
    • 在第12行上,将配置文件从LdapAccount更改为TestAccount
    • 在第16行中,将位置从erLDAPUserAccount.xml更改为erTestUserAccount.xml
  6. 编辑TestProfile/schema.dsml文件:
    • 在第356行上,将名称从erLDAPUserAccount更改为erTestAccount
  7. 编辑TestProfile/CustomLabels.properties文件:
    • 将第16行更改为TestAccount=Test Account
    • 将第18行更改为TestProfile=Test Profile
  8. 创建一个新的服务定义文件:
    jar cvf TestProfile.jar TestProfile/
  9. 在IBM Security Identity Manager用户界面中,单击配置系统>管理服务类型 。 然后,单击导入 ,然后导入新的服务定义文件: ~/new_adapter/TestProfile.jar
  10. 等待几分钟,以安装新的配置文件。 安装后,您将在IBM Security Identity Manager管理界面中看到它,如图22所示:
    图22.安装了新的配置文件
    IBM Security Identity Manager管理界面中新概要文件的屏幕快照。

现在,我可以修改用户表单。

  1. 单击配置系统>设计表单
  2. 在表单设计器中单击帐户>测试帐户
  3. 通过选择以下右选项卡并单击选项卡>删除选项卡删除它们:
    • $ tag.ldap.Business
    • $ tag.ldap.Address
    • $ tag.ldap.Other
  4. 删除$ eruid$ cn$ sn以外的所有帐户属性。
  5. 单击软盘图标以保存新表格。
  6. 用新类型创建服务。
  7. 申请一个帐户,然后查看该帐户表单是图23所示的新定制版本。
    图23.新服务类型的帐户表单
    自定义帐户表单的屏幕截图。

结论

在本文中,您学习了如何使用IBM Tivoli Directory Integrator为IBM Security Identity Manager创建新的LDAP服务器适配器。 每当需要将IBM Security Identity Manager与不受支持的应用程序或服务连接时,都需要构建适配器。 如您所见,LDAP服务器适配器相对易于配置,并且可以处理使用IBM Security Identity Manager管理用户帐户所需的所有功能。

致谢

Eddie Hartman和Jens Thomassen帮助我使用了IBM Tivoli Directory Integrator,特别是实现了LDAP搜索操作。 我还要感谢Clyde W. Zoch阅读本文并更正了一些错误。 剩下的错误当然是我自己的错。

从ISIM 6.0版开始,Miroslav Mandic找到了一种更好的编辑帐户表单的方法。


翻译自: https://www.ibm.com/developerworks/security/library/se-adapters/index.html

ibm报表数据源适配器出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值