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中使用的新适配器:
com.ibm.itim.remoteservices.provider.ServiceProviderFactory
接口的类,以Java™代码构建适配器。 请在运行IBM Security Identity Manager的任何计算机上查看/opt/IBM/isim/extensions/6.0/examples/serviceprovider/Readme.html,以了解有关此方法的更多信息。 本文中的演示基于LDAP服务器实现。 如果您尚未在开发或管理环境中设置IBM Security Identity Manager,请参阅参考资料立即下载并安装它。
本文的演示适配器充当IBM Tivoli Directory Integrator中实现的LDAP服务器。 图1显示了此类适配器的数据流示意图。
请求是在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,我将按照以下步骤进行操作:
ITIMAd
不同的API端口): /opt/IBM/TDI/V7.1.1/ibmditk &
LDAPServerAdapter
。 LDAPListener
。 接下来,我将为适配器创建一个测试服务。 然后,我将能够使用测试服务来添加,修改和删除用户帐户。
属性 | 值 |
---|---|
服务名称 | TestService |
目录服务器位置 | ldap://localhost:12345 |
管理员名称 | cn=root |
密码 | whatever |
注意:目录服务器位置应该是到达LDAP服务器所需的主机名和端口。
ou=users
,并将组基本DN指定为ou=groups
。 而已。 您已经将新适配器构建为LDAP服务器实现,但是它什么都没做。 在下一部分中,我将通过使用适配器在IBM Security Identity Manager和目标系统之间添加,协调,删除和修改用户帐户来进行一些练习。
实施最简单的LDAP服务器请求是添加请求。 首先,将一个新的用户帐户添加到测试服务,然后为新请求创建一个分支。
尝试为新服务的用户请求一个帐户。 由请求创建的工作对象应该类似于图3中的窗口。
您应该在IBM Security Identity Manager控制台中看到,尽管没有响应,但是该请求被认为是成功的。
接下来,尝试为添加请求添加分支:
add
(点击添加Case组件,类型add
,然后单击确定 )。 uid
, sn
和cn
值。 工作属性 | 分配 |
---|---|
cn |
work["ldap.entry"].getValue(0).cn |
sn |
work["ldap.entry"].getValue(0).sn |
uid |
work["ldap.entry"].getValue(0).uid |
ldapadd -h localhost -p 12345 -x
dn: uid=test,ou=users
uid: test
sn: Est
cn: Tom Est
objectClass: inetOrgPerson
uid
, sn
和cn
,如图5所示。 接下来,我将创建一个数据库表并向其中添加条目。 在将新条目添加到DB2表之前,需要创建它。
db2
CREATE DATABASE adapter
CONNECT TO adapter
CREATE TABLE accts(uid VARCHAR(10), cn VARCHAR(30))
quit
localhost
(或运行DB2的服务器),端口号(通常为50000
)和数据库名称adapter
。 (如果端口错误,请使用grep db2 /etc/services
查看给定系统上DB2使用的端口号。) root
和object00
)。 work.cn
映射到cn
并将work.uid
到uid
。 ( 请注意,在这些情况下大小写无关紧要: work.CN
与work.cn
相同。 ) 您已经配置了数据库适配器。 现在通过添加新帐户进行测试:
TestService
设置帐户。 db2 CONNECT TO adapter
db SELECT cn,uid FROM accts
调节是确保服务中的用户帐户与IBM Security Identity Manager中的帐户记录匹配的过程。 为了使对帐有效,该服务必须能够响应搜索请求。
首先尝试与您的测试服务进行对帐。 它将失败,但是您将看到必须进行处理才能使对帐生效的搜索请求。 尝试将导致以下窗口中显示三个搜索请求:
测试服务必须能够以结果响应用户搜索请求。 对于其他两个请求,我可以发送一个空答复。
我需要做的第一件事是创建一个搜索分支,如下所示:
search
用例:{work.ldap.operation} 。 属性 | 不 | 操作员 | 值 | 区分大小写 |
---|---|---|---|---|
ldap.searchfilter |
明确 | equals |
(objectclass=inetOrgPerson) |
明确 |
forEachUser
。 接下来,我将创建一个循环以遍历数据库中的用户。 这里的许多步骤与我之前将数据库连接到add
分支所遵循的步骤相同。
localhost
(或使用运行DB2的服务器),端口号50000
和数据库adapter
。 (如果端口错误,请使用grep db2 /etc/services
查看数据库系统上DB2使用的端口号。) root
和object00
)。 最后,我将使用脚本将用户发送到LDAP服务器连接器。
通过清单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);
我将以对帐结束测试搜索功能。
db2
CONNECT TO adapter
INSERT INTO accts(uid,cn) VALUES ('test','Tom Est')
INSERT INTO accts(uid,cn) VALUES ('jdoe','Jane Doe')
quit
ldapsearch
并看到您拥有所有用户。 在一行上全部键入以下命令: ldapsearch -x -h localhost -p 12345 objectclass=inetOrgPerson
ldapsearch
其他过滤器再次运行ldapsearch
; 请注意,您不会获得任何结果。 在本部分中,我将研究IBM Security Identity Manager与AssemblyLine之间的删除请求。 您会发现,删除用户帐户不只是发出请求而已。
首先使用IBM Security Identity Manager删除帐户。 该请求将在测试服务上失败,从而导致错误消息,如图13所示。
让我们调查发生了什么。 首先,检查组装流水线的控制台日志以查看IBM Security Identity Manager尝试验证该帐户:
如您所见,上一个请求使用了过滤器( &(uid =< user id >)( objectclass = inetorperson ))
。
请注意,在IBM Security Identity Manager甚至可以尝试发出删除请求之前,组装流水线必须能够响应这种单独的搜索请求。
要响应单个搜索请求,请使用正则表达式查找包含( uid =< uid >
)条件的那些请求。
属性 | 不 | 操作员 | 值 | 区分大小写 |
---|---|---|---|---|
ldap.searchfilter |
明确 | 包含 | (uid= |
已选 |
uid
其值是使用清单2中的脚本计算的。 // This is to identify the UID in filters of the type
// (&(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;
属性 | 值 |
---|---|
组件名称 | 数据库连接器(JDBC) |
名称 | readUser |
模式 | 抬头 |
数据库类型 | DB2 |
主机名 | localhost1 |
港口 | 50000 |
数据库 | adapter |
用户名 | 示例: root |
密码 | 示例: object00 |
表名 | 培训中心 |
UID equals $uid
LDAPServerConnector.reply(new com.ibm.di.entry.Entry());
sendUser
并将其粘贴到新分支中: ldapsearch -x -h localhost -p 12345 uid=jdoe
现在尝试再次删除一个帐户。 如您在图17和图18中看到的,仍然有两个未处理的请求:
下一步是处理在图17中看到的删除请求。
delete
。 uid
其值是使用清单3中的脚本计算的。 // 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;
DeleteUser
。 db2 connect to adapter
db2 select cn,uid from accts
db2 select cn,uid from accts
在本部分中,我将向组装流水线添加必要的组件以实现修改请求。
cn
)。 如您所见,有两个请求。 第一个是搜索用户信息,我已经处理过了。 第二个是修改请求本身,如图20所示。 modify
使用用于创建以前的分支同样的程序分支。 DN
获取UID
的机制与delete
分支中的机制相同。 右键单击属性映射以将其复制,然后将其粘贴到modify
分支中。 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);
}
}
}
deleteUser
连接器,调用拷贝modifyUser
,将它拖到底部modify
分支和模式改变为更新 。 现在,AssemblyLine应该看起来如图21所示。 到目前为止,我一直在使用标准的LDAP用户表单。 但是,一个更加用户友好的系统将仅显示我实际使用的字段,并将其标记为适合给定的服务类型。 在本节中,您将学习如何为给定的服务类型修改用户表单。
注意:从6.0版开始,有一个更简单的解决方案,由Miroslav Mandic找到。 您可以将服务类型保留为LdapProfile,然后编辑单个服务的形式。 有关详细信息,请参阅此页面底部的读者评论部分。
第一步是创建一个新的服务类型:
mkdir ~/new_adapter
cd ~/new_adapter
jar xvf /opt/IBM/isim/config/adapters/LdapProfile.jar
mv LdapProfile TestProfile
mv TestProfile/erLDAPUserAccount.xml \
TestProfile/erTestUserAccount.xml
TestProfile/service.def
文件:
LdapProfile
更改为TestProfile
LdapProfile
更改为TestProfile
erLDAPUserAccount
更改为erTestAccount
LdapAccount
更改为TestAccount
erLDAPUserAccount.xml
更改为erTestUserAccount.xml
TestProfile/schema.dsml
文件:
erLDAPUserAccount
更改为erTestAccount
。 TestProfile/CustomLabels.properties
文件:
TestAccount=Test Account
TestProfile=Test Profile
jar cvf TestProfile.jar TestProfile/
~/new_adapter/TestProfile.jar
。 现在,我可以修改用户表单。
在本文中,您学习了如何使用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报表数据源适配器出错