Sun Java System Directory Server Enterprise Edition 6.3 管理指南

联接多个不同的数据源

此配置以 Example.com 组织为例,说明虚拟目录的某些功能如何满足该组织的特定目录服务要求。

数据存储方案

Example.com 将组织数据存储在多个不同的数据源中。由于过去的原因,用户数据分布在 LDAP 目录、平面 LDIF 文件和 SQL 数据库中。人力资源部门将用户数据存储在基 DN 为 o=example.com 的 LDAP 目录中。薪酬部门将数据存储在 SQL 数据库中。管理部门将管理数据(如部门和大楼编号)存储在基 DN 为 dc=example,dc=com 的 LDIF 文件中。

此外,Example.com 还收购了一个名为 Company22 的公司。Company 22 也将其用户数据存储在基 DN 为 dc=company22,dc=com 的 LDAP 目录中。

下图提供了说明 Example.com 用户数据存储方式的高级视图。

图 23–2 不同源中的数据存储

图中显示了 Example.com 用户数据在不同数据源中的存储方式

客户端应用程序要求

Example.com 有几个 LDAP 客户端应用程序需要访问存储在不同数据源中的数据。这些客户端应用程序的要求不尽相同。因此需要不同的数据视图。在某些情况下,客户端需要聚合数据。另外,某些客户端应用程序还需要访问 Company22 的用户数据,以便能够同时管理 Example.com 的新老员工。

下图提供了 Example.com 客户端应用程序要求的高级视图。

图 23–3 客户端应用程序要求

图中显示了 Example.com 的 LDAP 应用程序要求

以下部分提供了充分的目录代理服务器数据视图的配置示例,以满足此样例方案中所述的客户端应用程序要求。有关数据视图的工作方式的信息,请参见《Sun Java System Directory Server Enterprise Edition 6.3 Reference》中的第 17  章 “Directory Proxy Server Distribution”《Sun Java System Directory Server Enterprise Edition 6.3 Reference》中的第 18  章 “Directory Proxy Server Virtualization”

样例方案的配置可分为以下几部分:

聚合人力资源部门 LDAP 目录和管理部门 LDIF 文件中的数据

人力资源部门存储员工姓名、入职数据和职务级别等信息。管理部门存储大楼代码和办公室编号等其他信息。处理人力资源数据的客户端应用程序需要访问来自这两个数据源的组合数据。这两个数据源有一个公用属性 employeeNumber,即每个条目中都具有该属性 。

下图说明了此客户端应用程序的要求。

图 23–4 来自 LDAP 目录和 LDIF文件的数据聚合

图中显示了 LDAP 目录和 LDIF 文件的联接视图

要满足此应用程序要求,需要为薪酬目录和管理 LDIF 文件各创建一个数据视图。然后将这两个数据视图联接在一起,以提供对聚合数据的访问。目录代理服务器可以使用此公用属性聚合每个用户的数据。

为了简单起见,本部分中使用的命令假定运行环境如下:

要获取每个命令的完整语法,请运行不含任何选项的命令。例如:

$ dpconf create-ldap-data-view
Operands are missing
Usage: dpconf create-ldap-data-view VIEW_NAME POOL_NAME SUFFIX_DN

Procedure为薪酬目录创建和启用 LDAP 数据视图

  1. 为薪酬目录创建 LDAP 数据源。

    $ dpconf create-ldap-data-source payroll-directory payrollHost:2389
  2. 为薪酬目录创建 LDAP 数据源池。

    $ dpconf create-ldap-data-source-pool payroll-pool
  3. 将薪酬数据源连接到此数据源池。

    $ dpconf attach-ldap-data-source payroll-pool payroll-directory
  4. 配置连接数据源的权重。

    $ dpconf set-attached-ldap-data-source-prop -h payrollHost -p 2389 \
    payroll-pool payroll-directory add-weight:2 \
    bind-weight:2 compare-weight:2 delete-weight:2 \
    modify-dn-weight:2 modify-weight:2 search-weight:2
  5. 为薪酬目录创建 LDAP 数据视图。

    $ dpconf create-ldap-data-view payroll-view payroll-pool o=example.com
  6. 启用 LDAP 数据视图,以便客户端请求可以路由到此数据视图。

    $ dpconf set-ldap-data-view-prop payroll-view is-enabled:true
  7. 重新启动目录代理服务器以使更改生效。

    $ dpadm restart /local/myDPS

Procedure为管理数据创建和启用 LDIF 数据视图

  1. 为管理数据创建 LDIF 数据视图。

    $ dpconf create-ldif-data-view admin-view example.ldif dc=example,dc=com
  2. 启用管理数据的 LDIF 数据视图。

    $ dpconf set-ldif-data-view-prop admin-view is-enabled:true
  3. 指定管理视图包含可由薪酬视图中的多个条目使用的条目。

    $ dpconf set-ldif-data-view-prop admin-view contains-shared-entries:true

    此属性设置为 TRUE 时,删除薪酬数据视图中的条目不会导致管理数据视图中的共享条目被删除。向薪酬数据视图添加条目只会将该条目添加到从数据视图(如果该条目尚不存在)。

  4. 重新启动目录代理服务器以使更改生效。

    $ dpadm restart /local/myDPS

Procedure联接薪酬数据视图和管理数据视图

  1. 在管理数据视图上创建过滤器联接规则,该规则指定数据的聚合方式。

    以下联接规则指定应该根据用户条目的 employeeNumber 属性联接数据。

    $ dpconf set-ldif-data-view-prop admin-view \
    filter-join-rule:employeeNumber=\${payroll-view.employeeNumber}
  2. 创建聚合这两个数据视图的联接数据视图。

    对于该联接数据视图,组织将使用后缀 DN dc=example,dc=com

    $ dpconf create-join-data-view example-join-view payroll-view admin-view \
    dc=example,dc=com

通过重命名 DN 将 Company 22 的数据添加到 Example.Com 的 DIT 中

Company 22 的用户数据存储在 DN dc=company22,dc=com 下。虽然在大多数情况下 Example.com 希望单独保留此用户数据,但一个客户端应用程序需要同时管理 Company 22 员工和其他 Example.com 员工。此客户端应用程序要求 Company 22 的用户数据类似于 Example.com 数据。

下图说明了此客户端应用程序的要求。

图 23–5 DN 重命名

图中显示了通过重命名 DN 将数据添加到 DIT

要满足此应用程序要求,需要为 Company 22 的目录创建一个虚拟 DN 为 dc=example,dc=com 的数据视图。

为了简单起见,本部分中使用的命令假定运行环境如下:

Procedure使用虚拟 DN 为 Company 22 的目录创建数据视图

  1. 为 Company 22 的目录创建 LDAP 数据源。

    $ dpconf create-ldap-data-source company22-directory company22Host:2389
  2. 为 Company 22 的目录创建 LDAP 数据源池。

    $ dpconf create-ldap-data-source-pool company22-pool
  3. 将 Company 22 的数据源连接到此数据源池。

    $ dpconf attach-ldap-data-source company22-pool company22-directory
  4. 配置连接数据源的权重。

    $ dpconf set-attached-ldap-data-source-prop -h company22Host -p 2389 \
    company22-pool company22-directory add-weight:2 \
    bind-weight:2 compare-weight:2 delete-weight:2 \
    modify-dn-weight:2 modify-weight:2 search-weight:2
  5. 使用虚拟 DN dc=example,dc=com 为 Company 22 的目录创建 LDAP 数据视图。

    $ dpconf create-ldap-data-view company22-view company22-pool dc=example,dc=com
  6. 指示目录代理服务器将此虚拟 DN 映射到 Company 22 目录中的实际 DN。

    $ dpconf set-ldap-data-view-prop company22-view \
    dn-mapping-source-base-dn:dc=company22,dc=com
  7. 启用 Company 22 目录的 LDAP 数据视图,以便客户端请求可以路由到此数据视图。

    $ dpconf set-ldap-data-view-prop company22-view is-enabled:true
  8. 重新启动目录代理服务器以使更改生效。

    $ dpadm restart /local/myDPS

将 Company 22 数据添加到人力资源数据

人力资源部门需要人力资源数据(来自 Example.com 和最近收购的 Company 22)的聚合视图。下图说明了人力资源部门全局应用程序的要求。

图 23–6 来自联接数据视图和 LDAP 数据视图的数据聚合

图中显示了 LDAP 目录和其他联接视图的复合联接视图

Procedure联接示例联接数据视图和 Company 22 数据视图

  1. 在 Company 22 数据视图上创建过滤器联接规则,该规则指定数据的聚合方式。

    以下联接规则指定应该根据用户条目的 employeeNumber 属性联接数据。

    $ dpconf set-ldif-data-view-prop company22-view \
    filter-join-rule:employeeNumber=\${example-join-view.employeeNumber}
  2. 创建联接数据视图,该视图将 Company 22 的数据视图和 Example.com 的联接数据视图聚合在一起。

    $ dpconf create-join-data-view global-join-view example-join-view \
    company22-view dc=example,dc=com

使 LDAP 客户端可以访问 SQL 数据库中的薪酬数据

Example.com 的薪酬部门将薪水数据存储在 SQL 数据库中。该数据库有两个表,即 employee 表和 salary 表。Example.com 具有需要访问这些数据的 LDAP 客户端应用程序。该客户端应用程序要求 SQL 数据类似于 LDAP 数据。

下图说明了此客户端应用程序的要求。

图 23–7 提供 SQL 数据库访问的 JDBC 数据视图

图中显示了提供 SQL 数据库访问的 JDBC 数据视图

要满足此应用程序要求,需要创建一个将 SQL 表中的列映射到 LDAP 属性的 JDBC 数据视图。

为了简单起见,本部分中使用的命令假定运行环境如下:

Procedure为 Example.com 的薪酬数据库创建 JDBC 数据视图

  1. 为薪酬数据库创建 JDBC 数据源。

    $ dpconf create-jdbc-data-source -b payrollsqldb \
      -B jdbc:payrollsqldb:payrollsql://localhost/ \
      -J file://payrollsqldb.jar \
      -S org.payrollsqldb.jdbcDriver payroll-src 
  2. 使用 SQL 数据库的属性配置 JDBC 数据源。

    $ dpconf set-jdbc-data-source-prop payroll-src \
      db-user:proxy db-pwd-file:password-file-location/myPasswordFile
  3. 启用 JDBC 数据源。

    $ dpconf set-jdbc-data-source-prop payroll-src is-enabled:true
  4. 为薪酬数据库创建 JDBC 数据源池。

    $ dpconf create-jdbc-data-source-pool payroll-pool
  5. 将薪酬数据源连接到此数据源池。

    $ dpconf attach-jdbc-data-source payroll-pool payroll-src
  6. 使用虚拟 DN o=payroll 为薪酬数据库创建 JDBC 数据视图。

    $ dpconf create-jdbc-data-view payroll-view payroll-pool o=payroll
  7. 为 SQL 数据库中的每个表创建 JDBC 表。

    $ dpconf create-jdbc-table jdbc-employee employee
    $ dpconf create-jdbc-table jdbc-salary salary
  8. 为 SQL 表中的每一列添加 JDBC 属性。

    $ dpconf add-jdbc-attr jdbc-employee eid employee_id
    $ dpconf add-jdbc-attr jdbc-employee first firstname
    $ dpconf add-jdbc-attr jdbc-employee last lastname
    $ dpconf add-jdbc-attr jdbc-employee description description
    $ dpconf add-jdbc-attr jdbc-employee spouse spousename
    $ dpconf add-jdbc-attr jdbc-salary salary salary
    $ dpconf add-jdbc-attr jdbc-salary social ssn
  9. 指定可以通过 JDBC 数据视图查看和写入的属性。

    $ dpconf set-jdbc-data-view-prop payroll-view \
     viewable-attr:eid \
     viewable-attr:first \
     viewable-attr:last \
     viewable-attr:desc \
     viewable-attr:spouse \
     viewable-attr:salary \
     viewable-attr:social 
     $ dpconf set-jdbc-data-view-prop payroll-view \
     writable-attr:eid \
     writable-attr:first \
     writable-attr:last \
     writable-attr:description \
     writable-attr:spouse \
     writable-attr:salary \
    writable-attr:social
  10. 创建一个映射到 LDAP 对象类的 JDBC 对象类。

    以下命令将创建一个映射到 LDAP person 对象类的对象类。该对象类指定应该将员工表用作主表,而将薪水表用作从表。eid 属性应用于构建 DN。

    $ dpconf create-jdbc-object-class payroll-view \
     person jdbc-employee jdbc-salary eid
  11. 在从表上创建过滤器联接规则,该规则指定从表中的数据应如何链接到主表数据。

    以下联接规则指定应根据 employee_id 属性联接数据。

    $ dpconf set-jdbc-table-prop jdbc-salary \
    filter-join-rule:employee_id=\${employee.employee_id}
  12. 在 JDBC 对象类上创建超类。

    $ dpconf set-jdbc-object-class-prop payroll-view person super-class:extensibleObject

添加虚拟访问控制

LDAP 目录上的访问控制是通过定义这些目录中的 ACI 来处理的。通过虚拟数据视图访问数据源时必须定义 ACI,这些 ACI 只适用于通过这些数据视图查看的数据。

所有通过目录代理服务器的访问都由连接处理程序进行控制。有关连接处理程序的信息,请参见第 26 章,客户端和目录代理服务器之间的连接

Procedure添加允许匿名访问的 ACI

  1. 添加 ACI。

    $ ldapadd -v -D "cn=proxy manager" -w password -p 389
    dn: cn=ldifonly-acis,cn=virtual access controls
    objectclass: top
    objectclass: aciSource
    cn: ldifonly-acis
    dpsaci: (targetattr="*")(version 3.0; acl "anonymous_access"; allow(all) \
    (userdn="ldap:///anyone");)
  2. 将连接处理程序指向虚拟 ACI。

    $ dpconf set-connection-handler-prop anonymous aci-source:ldifonly-acis
  3. 启用连接处理程序。

    $ dpconf set-connection-handler-prop anonymous is-enabled:true