级别: 初级 Krishnakumar Balachandar (krishnakumarb@in.ibm.com), 软件工程师,WebSphere Application Server Community Edition Support Team, IBM
2006 年 5 月 23 日 了解如何使用 IBM® Tivoli® Directory Server 配置 LDAP 领域,从而实现 WebSphere® Application Server Community Edition 的用户身份验证和授权。
引言
IBM WebSphere Application Server Community Edition 是基于 Apache Geronimo 的 Java® 2 Platform Enterprise Edition (J2EE) 应用程序。本文将介绍如何将 IBM Tivoli Directory Server V 6.0(以下称为 Directory Server)和 IBM WebSphere Community Edition 1.0.1(以下称为 Community Edition)一起使用,以进行用户身份验证和授权。本文的目标读者是希望使用 Directory Server 为其即将部署到 Community Edition 中的应用程序配置 LDAP 领域的 J2EE 应用程序开发人员。
应用服务器在基于文件、数据库、LDAP 或其他自定义注册中心的存储库中存储凭据。LDAP 存储库可以存储与用户相关的静态信息,可供整个企业中的所有应用程序使用。本文演示了如何使用 Directory Server 在 Community Edition 中配置 LDAP 领域。我们还将部署一个使用 Directory Server 中的 LDAP 项的示例应用程序。
关于 LDAP 记录
可以使用 LDAP 来存储各种用户信息,如 ID、地址、电话号码、角色和密码。这些数据组织为树形结构(从层次结构的根开始)。清单 1 显示了一个示例 LDAP 用户记录。
清单 1. 示例 LDAP 用户记录
dn: uid=guest1,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: guest1
sn: guest1
displayName: Guest
uid: guest
userpassword: welcome
ou: people
|
清单 1 中的用户记录称为 Guest1,其用户 ID 是 guest1,密码是 welcome。ePerson 类型的 LDAP 记录存储其他用户信息,如地址、电话等。
可以基于角色对 LDAP 树中创建的用户进行分组。例如,可以将所有具有管理权限的用户分组到 admin 角色下。清单 2 显示了根据用户进行了分组的用户(user1、user2)。
清单 2. 按角色进行分组的用户
dn: cn=users,ou=groups, dc=ibm,dc=com
objectClass: groupOfUniqueNames
uniqueMember: cn=user2,cn=user1,ou=groups,dc=ibm,dc=com
cn: users
|
与前面的两个 LDAP 项类似,可以创建一个复杂结构来对用户和角色进行映射。可以将这些详细信息存储在 LDIF 文件中,并上载到任何 LDAP 服务器。本文中使用的示例应用程序包含了一个 LDIF 文件,其 LDAP 结构如图 1 中所示。
图 1. LDAP 结构
配置 Tivoli Directory Server
在本部分,我们将配置 Tivoli Directory Server。
可以将 Tivoli Directory Server 作为独立产品与应用服务器安装在同一台计算机上,也可以安装于不同的计算机上。缺省情况下,该产品会使用 389 端口。Tivoli Directory Server 提供了用于在服务器上执行各种操作的实用工具。可以通过 Web 接口 (http://localhost:12100/IDSWebApp/IDSjsp/IDSConsoleFrameWork.jsp) 调用这些操作,但需要在安装 IBM Tivoli Directory Server 时已经安装了 WebSphere Application Server – Express。
要启动 IBM Tivoli Directory Server 并将 LDIF 文件上载到该服务器,请输入清单 3 中所示的命令:
清单 3. Directory Server 命令
adding suffix : idscfgsuf -s dc=ibm,dc=com
start itds : ibmslapd
add ldap entries from ldif : ldapadd -h ldap://<ldaphostname> -D "cn=root" -w
"********" -f <ldif_directory_path><filename>.ldif
|
图 2 显示了在 Directory Server 中创建的 LDAP 项。
图 2. Directory Server 中的 LDAP 项
Web 应用程序安全与 LDAP
Web 应用程序安全包括身份验证和授权两方面。将在部署描述符中对此进行定义。在部署描述中,可以为身份验证和授权配置特定的领域。要使用 LDAP,请将身份验证配置为基于表单的身份验证,并调用 LDAP 来检查用户 ID 和凭据。
类似地,可以基于部署描述符中定义的角色对用户进行分组,并在 LDAP 服务器中创建对应的项。图 3 显示了 Web 部署描述中的安全约束和角色、WebSphere Application Server Community Edition 的“Geronimo”计划以及其与 LDAP 中各项的映射关系。
图 3. 安全约束和角色映射
为 LDAP 领域创建 Community Edition 计划
要在 WebSphere Application Server Community Edition 中使用 LDAP,需要创建相应的领域计划。然后可以在服务器范围内或应用程序(或模块)范围内部署此计划。清单 4 显示了 Community Edition 的一个示例 LDAP 领域计划。
清单 4. LDAP 领域计划
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns="http://geronimo.apache.org/xml/ns/deployment-1.0"
configId="org/apache/geronimo/ldap-secure"
>
<gbean name="ldap-login"
class="org.apache.geronimo.security.jaas.LoginModuleGBean">
<attribute name="loginModuleClass">
org.apache.geronimo.security.realm.providers.LDAPLoginModule</attribute>
<attribute name="serverSide">true</attribute>
<attribute name="options">
initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
connectionURL=ldap://<host>:389
connectionUsername=cn=root
connectionPassword=*******
connectionProtocol=
authentication=simple
userBase=ou=people,dc=ibm,dc=com
userSearchMatching=uid={0}
userSearchSubtree=false
roleBase=ou=groups,dc=ibm,dc=com
roleName=cn
roleSearchMatching=(uniqueMember={0})a
roleSearchSubtree=false
userRoleName=
</attribute>
<attribute name="loginDomainName">ldap-realm</attribute>
</gbean>
<gbean name="ldap-realm"
class="org.apache.geronimo.security.realm.GenericSecurityRealm">
<attribute name="realmName">ldap-realm</attribute>
<reference name="LoginModuleConfiguration">
<name>ldap-login</name>
</reference>
<reference name="ServerInfo">
<module>geronimo/j2ee-system/1.0/car</module>
<name>ServerInfo</name>
</reference>
<reference name="LoginService">
<module>geronimo/j2ee-security/1.0/car</module>
<name>JaasLoginService</name></reference>
</gbean>
<gbean name="ldap-login" class="org.apache.geronimo.security.jaas.JaasLoginModuleUse">
<attribute name="controlFlag">REQUIRED</attribute>
<reference name="LoginModule">
<name>ldap-login</name>
</reference>
</gbean>
</configuration>
|
此 LDAP 领域计划包含三个 Gbean。部署后,它将配置 JAAS 使用 LDAPLoginModule 来连接到 LDAP 服务器并检索用户凭据。要获得用户详细信息,可以使用以下查询:userSearchMatching=uid={0} and roleSearchMatching=(uniqueMember={0})。LDAPLoginModule 将基于这些项来检索用户和角色。
可以通过使用 Community Edition 控制台或以下部署工具来部署 LDAP 领域:
java -jar bin\deployer.jar deploy ldap-realm-ibm.xml
现在已经配备了 LDAP 领域,接下来需要配置 LDAP Web 应用程序使用该 LDAP 领域。可以将这些细节添加到 geronimo-web.xml 计划文件,如清单 5 中所示。
清单 5. geronimo-web.xml 计划
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/web"
xmlns:sec="http://geronimo.apache.org/xml/ns/security"
configId="org/apache/geronimo/ldap-secure-demo"
parentId="org/apache/geronimo/ldap-secure">
<context-root>/ldap-demo</context-root>
<context-priority-classloader>false</context-priority-classloader>
<container-config container="Tomcat">
<config-param name="TomcatRealm">TomcatJAASRealm</config-param>
</container-config>
<security-realm-name>ldap-realm</security-realm-name>
<security>
<default-principal realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="system" />
</default-principal>
<role-mappings>
<role role-name="admin">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="admin" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="system" />
</realm>
</role>
<role role-name="users">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="users" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="user1" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="user2" />
</realm>
</role>
<role role-name="guest">
<realm realm-name="ldap-realm">
<principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"
name="guest" designated-run-as="true" />
<principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"
name="guest1" />
</realm>
</role>
</role-mappings>
</security>
</web-app>
|
geronimo-web 计划中的角色应与 Web 描述符和 LDAP 组中创建的角色匹配。
该 Web 应用程序已打包为 EAR 文件,在示例 zip 文件 (LDAPExample.ear) 中提供。可以使用 Community Edition 控制台来部署该应用程序。
使用示例应用程序
在前面的部分中,我们已经创建了一个 LDAP 领域,并对 Web 应用程序进行了相应配置,以使用该领域。我们还对该应用程序和领域进行了部署。要访问该 Web 应用程序,请输入以下 URL:"http://localhost:8080/LDAPWeb"。现在可以登录到 Web 应用程序,该程序将通过从 LDAP 目录检索相关项来验证用户 ID 和凭据。登录时,该应用程序将基于 Web 部署描述符中定义的角色检查对受保护资源的访问权限。
结束语
在本文中,我们在 Directory Server 中创建了用户记录,并在 Community Edition 中部署了一个 LDAP 领域。文中提供的示例 Web 应用程序演示了如何使用 LDAP 领域来获取用户凭据和角色。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample Web application | wasce-ldap-sample.zip | 25 KB |
FTP | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Krishnakumar Balachandar 是位于印度 Bangalore 的 IBM Software Labs 的高级软件工程师。他在 Geronimo 和 WebSphere Community Edition 的支持团队工作。您可以通过 krishnakumarb@in.ibm.com 与 Krishnakumar 联系。 |
对本文的评价
|