联接 LDAP 目录和 MySQL 数据库
本部分中的过程介绍将 LDAP 目录和 MySQL 数据库联接在一起的样例虚拟配置。LDAP 目录是主数据源,其中包含大多数用户信息。MySQL 数据库包含有关用户的其他信息。下图说明了最终的配置。
图 23–1 样例虚拟配置可以使用 install-path/ds6/ldif/Example.ldif 中提供的样例数据复制此示例,也可以使用您自己的数据替换样例数据。
此配置可以分为三个部分:
配置和测试 LDAP 数据视图
配置和测试 JDBC 数据视图
配置和测试联接数据视图
为了简单起见,本部分中的所有命令都假定目录代理服务器在 /local/dps 中的本地主机上运行。这些命令还假定设置了以下环境变量:
DIR_PROXY_PORT1389
LDAP_ADMIN_PWFpwd.txt,包含管理员密码的文件。
DIRSERV_PORT4389
LDAP_ADMIN_USERcn=Directory Manager
配置和测试 LDAP 数据视图
配置 LDAP 数据视图
开始之前本部分中的任务假定运行环境如下:
目录服务器实例通过端口 4389 在 host1上运行。
目录服务器中的数据存储在后缀 dc=example,dc=com 下。要复制此示例,请创建一个目录服务器实例,并创建后缀dc=example,dc=com,然后将样例数据导入 install-path/ds6/ldif/Example.ldif 中。
为目录服务器实例创建名为 myds1 的 LDAP 数据源。
% dpconf create-ldap-data-source myds1 host1:4389
启用该数据源,并允许对其执行写入操作。
% dpconf set-ldap-data-source-prop myds1 is-enabled:true is-read-only:false
创建名为 myds1-pool 的 LDAP 数据源池。
% dpconf create-ldap-data-source-pool myds1-pool
将 LDAP 数据源连接到此 LDAP 数据源池。
% dpconf attach-ldap-data-source myds1-pool myds1
指定数据源应接收来自该数据源池的所有绑定、添加、搜索和修改操作。
% dpconf set-attached-ldap-data-source-prop myds1-pool myds1 add-weight:100 \ bind-weight:100 modify-weight:100 search-weight:100
为数据源池创建名为 myds1–view 且基 DN 为 dc=example,dc=com 的 LDAP 数据视图。
% dpconf create-ldap-data-view myds1-view myds1-pool dc=example,dc=com
测试 LDAP 数据视图
以 dc=example,dc=com 下的用户身份搜索 LDAP 数据源中的所有条目,以验证您是否可以读取数据视图中的内容。
% ldapsearch -p 1389 -D "uid=kvaughan,ou=people,dc=example,dc=com" -w bribery \ -b dc=example,dc=com "objectclass=*"
注 –必须使用 dc=example,dc=com 下的用户凭证。如果要使用 cn=Directory Manager,则必须定义用于处理该 DN 的数据视图。
以 dc=example,dc=com 下的用户身份修改 userPassword 属性,以验证您是否可以向数据视图中写入内容。
% ldapmodify -p 1389 -D "uid=kvaughan,ou=people,dc=example,dc=com" -w bribery dn: uid=kvaughan,ou=people,dc=example,dc=com changetype: modify replace: userPassword userPassword: myNewPassword
注 –目录服务器中的默认 ACI 允许用户修改自己的密码。
配置和测试 JDBC 数据视图
以下任务假定已安装了 MySQL 数据库,该数据库正在运行并且填充了数据,同时该数据库还具有以下特性:
数据库名称:sample_sql
数据库 URL:host2.example.com:3306/
JDBC 驱动程序 URL:file:/net/host2.example/local/mysql/lib/jdbc.jar
驱动程序类:com.mysql.jdbc.Driver
数据库用户:root
数据库密码文件:mysqlpwd.txt
下表介绍数据库中的表及其复合字段。您需要使用此信息来设置 JDBC 数据视图。
MySQL 表 | 字段 |
---|---|
EMPLOYEE | ID、SURNAME、PASSWORD、ROOM、COUNTRY_ID |
COUNTRY | ID、NAME |
PHONE | USER_ID、NUMBER |
配置 JDBC 数据视图
为 SQL 数据库创建名为 mysql1 的 JDBC 数据源。
% dpconf create-jdbc-data-source -b sample_sql \ -B jdbc:mysql://host2.example.com:3306/ \ -J file:/net/host2.example/local/mysql/lib/jdbc.jar \ -S com.mysql.jdbc.Driver mysql1
指定该 SQL 数据库的用户名和密码文件。
% dpconf set-jdbc-data-source-prop mysql1 db-pwd-file:sqlpwd.txt db-user:root
重新启动代理服务器。
% dpadm restart /local/dps
启用该数据源,并允许对其执行写入操作。
% dpconf set-jdbc-data-source-prop mysql1 is-enabled:true is-read-only:false
创建名为 mysql1–pool 的 JDBC 数据源池。
% dpconf create-jdbc-data-source-pool mysql1-pool
将 JDBC 数据源连接到此数据源池。
% dpconf attach-jdbc-data-source mysql1-pool mysql1
为数据源池创建名为 myjdbc1–view 且基 DN 为 o=sql 的 JDBC 数据视图。
% dpconf create-jdbc-data-view mysql1-view mysql1-pool o=sql
为 MySQL 数据库中的每个表创建 JDBC 表。
% dpconf create-jdbc-table employee1 EMPLOYEE % dpconf create-jdbc-table country1 COUNTRY % dpconf create-jdbc-table phone1 PHONE
SQL 数据库中的表名区分大小写。请确保您使用的大小写与 SQL 数据库中使用的相同。
为每个表中的每一列创建 JDBC 属性。
创建 JDBC 属性会将 MySQL 列映射到 LDAP 属性。
% dpconf add-jdbc-attr employee1 uid ID % dpconf add-jdbc-attr employee1 sn SURNAME % dpconf add-jdbc-attr employee1 userPassword PASSWORD % dpconf add-jdbc-attr employee1 roomNumber ROOM % dpconf add-jdbc-attr phone1 telephoneNumber NUMBER % dpconf add-jdbc-attr country1 countryName NAME
无需为 phone1 user_id 和 country1 id 列创建 JDBC 属性,因为这些列仅包含用于 EMPLOYEE.ID(已为其创建 LDAP 属性 uid)中的值。
为 LDAP person 对象类创建 JDBC 对象类。
在此步骤中,employee1 表被标识为主表,而 country1 和 phone1 表被标识为从表。创建 JDBC 对象类时也需要 DN。在此示例中,DN 是通过数据视图的 uid 属性和基 DN 构建的。
% dpconf create-jdbc-object-class mysql1-view person employee1 country1 phone1 uid
定义主表和从表之间的联接规则。
联接规则在从表上进行定义,用于确定该表中的数据如何链接到主表数据。
% dpconf set-jdbc-table-prop country1 filter-join-rule:ID=\${EMPLOYEE.COUNTRY_ID} % dpconf set-jdbc-table-prop phone1 filter-join-rule:USER_ID=\${EMPLOYEE.ID}
指定 JDBC 对象类的超类。
超类表示 JDBC 对象类从中继承属性的 LDAP 对象类。
% dpconf set-jdbc-object-class-prop mysql1-view person super-class:top
创建所需的 ACI
测试 JDBC 数据视图之前,必须先通过配置 ACI 启用对数据视图的写入访问权限。默认情况下将拒绝对非 LDAP 数据视图的写入访问。在此示例中,只需添加一个允许用户修改其密码的全局 ACI。
以代理管理员身份向 JDBC 数据源中添加一个 ACI 池,并添加一个允许用户修改其条目的全局 ACI。
% ldapmodify -p 1389 -D "cn=proxy manager" -w password dn: cn=mysql1,cn=virtual access controls changetype: add objectclass: acisource dpsaci: (targetattr="*") (target = "ldap:///o=sql") (version 3.0; acl "enable all access for all users "; allow(all) userdn="ldap:///uid=kvaughan,o=sql";) cn: mysql1
创建一个连接处理程序,以处理到 o=sql 域的连接。
% dpconf create-connection-handler mysql1-handler
启用该连接处理程序,并将其配置为处理来自 o=sql 域用户的所有绑定。
% dpconf set-connection-handler-prop mysql1-handler is-enabled:true \ bind-dn-filters:"uid=.*,o=sql"
将连接处理程序配置为使用之前添加的 ACI 池。
% dpconf set-connection-handler-prop mysql1-handler aci-source:mysql1
测试 JDBC 数据视图
以 o=sql 下的用户身份搜索 JDBC 数据源,以验证您是否可以读取数据视图中的内容。
% ldapsearch -p 1389 -D "uid=kvaughan,o=sql" -w mypwd -b o=sql "objectclass=*"
注 –您必须使用 o=sql 下的用户的凭证。
以 o=sql 下的用户身份修改 userPassword 属性,以验证您是否可以向数据视图中写入内容。
% ldapmodify -p 1389 -D "uid=kvaughan,o=sql" -w mypwd dn: uid=kvaughan,o=sql changetype: modify replace: userPassword userPassword: myNewpwd
创建和测试联接数据视图
创建联接数据视图
创建名为 myjoin1–view 的联接数据视图。
将 LDAP 数据视图指定为主数据视图,将 JDBC 数据视图指定为从数据视图。
% dpconf create-join-data-view myjoin1-view myds1-view mysql1-view o=join
在从数据视图上定义联接规则。
以下联接规则指定从数据视图中条目的 uid 属性应该与主数据视图中条目的 uid 属性相匹配。
% dpconf set-jdbc-data-view-prop mysql1-view filter-join-rule:uid=\${myds1-view.uid}
如果在联接数据视图上设置了过滤器联接规则,则需要在从数据视图上设置虚拟转换规则,以便能够在联接数据视图上添加条目。
dpconf add-virtual-transformation secondary-view-name \ write add-attr-value dn uid=\${uid}
注 –如果未设置此规则,则无法在联接数据视图上添加条目。
定义可以通过联接数据视图从主数据视图读取以及向主数据视图写入的属性集。
% dpconf set-ldap-data-view-prop myds1-view viewable-attr:dn \ viewable-attr:cn viewable-attr:sn viewable-attr:givenName \ viewable-attr:objectClass viewable-attr:ou viewable-attr:l \ viewable-attr:uid viewable-attr:mail viewable-attr:telephoneNumber \ viewable-attr:facsimileTelephoneNumber viewable-attr:roomNumber \ viewable-attr:userPassword % dpconf set-ldap-data-view-prop myds1-view writable-attr:dn \ writable-attr:cn writable-attr:sn writable-attr:givenName \ writable-attr:objectClass writable-attr:ou writable-attr:l \ writable-attr:uid writable-attr:mail writable-attr:telephoneNumber \ writable-attr:facsimileTelephoneNumber writable-attr:roomNumber \ writable-attr:userPassword
这些定义仅适用于联接视图环境。默认情况下,如果直接访问 LDAP 数据视图,则可以读取和写入所有属性。
定义可以通过联接数据视图在从数据视图中读取以及向从数据视图写入的属性集。
% dpconf set-jdbc-data-view-prop mysql1-view viewable-attr:dn \ viewable-attr:objectclass viewable-attr:sn viewable-attr:roomNumber \ viewable-attr:userpassword viewable-attr:jobtitle viewable-attr:countryName \ viewable-attr:telephoneNumber % dpconf set-jdbc-data-view-prop mysql1-view writable-attr:dn \ writable-attr:objectclass writable-attr:sn writable-attr:roomNumber \ writable-attr:userpassword writable-attr:jobtitle \ writable-attr:countryName writable-attr:telephoneNumber
这些定义仅适用于联接视图环境。默认情况下,如果直接访问 JDBC 数据视图,则可以读取和写入所有属性。
创建所需的 ACI
以代理管理员身份添加一个允许匿名访问联接数据视图的全局 ACI。
% ldapmodify -p 1389 -D "cn=proxy manager" -w password dn: cn=myjoin1,cn=virtual access controls changetype: add objectclass: acisource dpsaci: (targetattr="*") (target = "ldap:///o=join") (version 3.0; acl "anonymous_access"; allow(all) userdn="ldap:///anyone";) cn: myjoin1
将连接处理程序配置为使用之前添加的 ACI 池。
% dpconf set-connection-handler-prop default-connection-handler aci-source:myjoin1
测试联接数据视图
以匿名用户身份搜索联接数据视图。
在此步骤中,我们将搜索 Kirsten Vaughan 的条目,以查看是否会检索来自两个联接视图的数据。
% ldapsearch -p 1389 -b o=join "uid=kvaughan"
请注意,返回的条目包括来自 LDAP 数据视图和 JDBC 数据视图的属性。
以 o=join 下的用户身份修改 userPassword 属性,以验证您是否可以向联接数据视图中写入内容。
% ldapmodify -p 1389 dn: uid=kvaughan,ou=people,o=join changetype: modify replace: userPassword userPassword: myPassword