WEB开发网
开发学院操作系统Linux/Unix 保持 Project Zero 和 WebSphere sMash 应用程序的... 阅读

保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

 2009-10-28 00:00:00 来源:WEB开发网   
核心提示:使用 LDAP 的高级用户注册表Project Zero 实现了身份验证和授权,应用程序可以通过定义安全性规则来利用 Zero 的安全性,保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权,比如决定哪些资源受保护、通过什么方法保护它们

使用 LDAP 的高级用户注册表

Project Zero 实现了身份验证和授权。应用程序可以通过定义安全性规则来利用 Zero 的安全性,比如决定哪些资源受保护、通过什么方法保护它们以及允许哪些用户和组访问这些资源。Zero 的身份验证基于 Java Authentication and Authorization Service(JAAS),它允许添加不同类型的登录模块,且无需更改身份验证模型。

安全性是 Project Zero 的核心特性集的一部分。因为 Zero 安全性是核心特性,所以启用安全性的惟一要求就是,适当地配置与用户服务注册表相关的配置,并为每个受保护的资源定义恰当的规则。本文面向的是已经熟悉 Project Zero 的中级开发人员 — 如果需要 Project Zero 的背景知识,可以参考 Developer's Guide 中对 Project Zero 安全性配置 的完整概述,或者阅读本系列的第一篇文章 “身份验证和授权”。本文主要关注如何在 Project Zero 中使用 LDAP 作为用户注册表,从而实现应用程序的安全性。

用户服务

用户服务是一个库,它为访问用户注册表提供一个可扩展的框架。支持的注册表类型包括文本文件和 LDAP(目录),但是如果需要的话,也可以创建定制的用户注册表。注册表类型的选择取决于具体的需求和环境:

文本文件注册表适合作为开发时注册表。

推荐将 LDAP 用于生产环境,因为增强的可靠性和安全性对于生产环境来说十分重要。

用户服务是 Project Zero 安全运行时和用户注册表之间的一个抽象层,可以通过编辑 zero.config 文件的 /config/security/userservice 部分来选择适当的用户注册表。本文讲解如何配置用户服务来访问基于 LDAP 的用户注册表。如果希望了解基于文件的用户注册表,那么请阅读第 1 部分 “身份验证和授权”,它概述了使用基于文件的用户服务的 Project Zero 安全性。

延续前一篇文章

本文延续第一篇文章 “身份验证和授权” 的内容。我们假设您已经从 Eclipse 更新站点安装了适当的 Project Zero 插件,并假设您知道如何在 Eclipse 中创建 Project Zero 应用程序。如果不是这样,请在继续之前参考 Developer's Guide 中的 “Core Getting Started” 页面。

正如前一篇文章指出的,我们将创建的应用程序很简单,它称为 StockTips。这个应用程序允许发布非常基本的股票市场信息。这个应用程序维护一个 “热点股票” 的列表,这个列表由一个股票市场专家更新并维护。这个专家经常在热门的新股票在市场上一出现就将其加入到他的列表中,他还会把业绩不好的企业的股票从列表中删除。很多对这位专家的股评感兴趣的人都会查看这个列表,他们在买入或卖出股票时会参考他的意见。如果专家提供的意见还不错,那么很多炒股人都会赚到钱!

这个应用程序的代码由一个名为 tips.groovy 的 groovy 文件及一个名为 tips.gt 的视图组成。因为本文主要关注在 Project Zero 中启用 LDAP,所以本文中只提供少量屏幕图,更多细节请参考第一篇文章。我们将集中讨论以不同方式使用 LDAP 所需的配置。

假设这位专家的股评站点越来越热门,增加了许多新的用户。由于这个站点非常热门,炒股人的数量不断增加,这位专家决定放弃基于文件的用户注册表,转而使用更接近企业级的 LDAP 用户注册表。这会支持这个应用程序从本地使用的应用程序向更为全球化的应用程序发展。因为我们只是要把用户从基于文件的用户注册表迁移到基于 LDAP 的用户注册表,所以所有炒股人都属于一个名为 'pundits' 的组。

从基于文件的用户服务迁移到 LDAP 用户服务

在设置 LDAP 用户服务的配置之前,我们应该在 LDAP 目录服务器上准备一个目录。对于第一个示例,将使用 图 1 所示的简单目录。有 10 个属于 'pundits' 组的用户(见 表 1),还有一个属于 'wizards' 组的特殊用户 'wizard'。为了创建这个目录,必须在 LDAP 目录服务器中创建根后缀 dc=myco,dc=com,然后从 下载 一节下载 LDAP Data Interchange Format(LDIF)文件 myco.startingpoint.ldif 并导入 LDAP 目录服务器。(创建根后缀的方法请查阅 LDAP 目录服务器的手册,因为这取决于 LDAP 服务器的实现。)可以使用 LDAP 工具导入 LDIF 文件,包括 Apache Directory studio、JXplorer 等等。LDAP 用户服务并不依赖于任何特定的 LDAP 目录服务器和工具。

LDAP 目录中的每个元素可以由一个相对区分名(relative distinguished name,RDN)标识,RDN 在一个子树下的同级元素中必须是惟一的。另外,每个元素有一个区分名(distinguished name,DN)。DN 是从一个叶元素到根的所有 RDN 的组合,它必须在整个目录中是惟一的。根据定义,DN 是 LDAP 目录中的完全限定名。例如,uid=mary,ou=people,o=hq,dc=myco,dc=com 是一个 DN,它的前缀 uid=mary 是一个 RDN。可以通过 IETF Web 站点了解 LDAP 的细节。


表 1. 在最初的目录示例中用户和组之间的映射
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

在默认情况下,LDAP 用户服务会把类型为对象类 netOrgPerson 的条目视为用户条目;uid 属性的值作为用户名;把类型为对象类 groupOfUniqueNames 的条目视为组;cn 属性的值作为组名。下载 一节中的 LDIF 文件 myco.startingpoint.ldif 定义了以下内容:

在 ou=people,o=hq,dc=myco,dc=com 下面定义了 10 个用户名和密码,这些用户是 'pundits' 组的成员。

用户名 mary,密码 mary_pwd

用户名 dan,密码 dan_pwd

用户名 ryan,密码 ryan_pwd

用户名 baxter,密码 baxter_pwd

用户名 bob,密码 bob_pwd

用户名 steve,密码 steve_pwd

用户名 tim,密码 tim_pwd

用户名 john,密码 john_pwd

用户名 ken,密码 ken_pwd

用户名 michael,密码 michael_pwd

在 ou=people,o=hq,dc=myco,dc=com 下面还定义了特殊用户 'wizard',但是他是 'wizards' 组的成员。

用户名 wizard,密码 wizard_pwd


图 1. 最初的目录示例
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

zero.config 是一个文本文件(位于 <approot>/config 下面),其中存储 Project Zero 的核心配置。为了让 Zero 使用 LDAP 目录对请求进行身份验证,必须在 zero.config 中 “/config/security/userservice” 下面添加一个配置部分(见清单 1)。


清单 1. zero.config 片段 — 简单目录示例的用户服务配置
/config/security/userservice/registryType="ldap" 
 
/config/security/userservice/ldap += { 
  "jndiProviderUrl":"ldap://localhost:10389/", 
  "jndiSecurityPrincipal":"uid=admin,ou=system", 
  "jndiSecurityCredentials":"<xor>LDo8LTor", 
  "ldapUserIdRdnPattern":"uid={0}", 
  "ldapUserIdBaseDn":"ou=people,o=hq,dc=myco,dc=com", 
  "ldapGroupBaseDn":"ou=group,o=hq,dc=myco,dc=com"  
} 

下面分别解释一下清单 1 的内容:

registryType 参数指定要使用哪个用户服务;将它设置为 "ldap",表示要使用 LDAP 用户服务。

jndiProviderUrl 属性是 LDAP 目录服务器的 URL;在这个示例中,LDAP 服务器运行在本地主机的 10389 端口上。

jndiSecurityPrincipal 定义用来连接目录服务器的主体(用户名);我们的主体称为 uid=admin,ou=system。

jndiSecurityCredentials 定义用来连接目录服务器的凭证(密码);我们的密码是经过 xor 编码的值 LDo8LTor。

ldapUserIdRdnPattern 指定一个 RDN 模板模式,它用于在目录服务器中搜索用户。在运行期间,用户服务会把占位符 "{0}" 替换为请求中的用户名。然后把 ldapUserIdRdnPattern 和 ldapUserIdBaseDN 连接在一起,创建出一个 DN 并在目录中搜索用户条目。在这个示例中,将使用前缀 uid= 和后缀 ou=people,o=hq,dc=myco,dc=com(从 ldapUserIdBaseDn 获得)搜索用户。

ldapUserIdBaseDn 是开始用户搜索的基 LDAP DN;我们的搜索将使用它作为 DN。

ldapGroupBaseDn 是开始组搜索的基 LDAP DN;对组的搜索将从这里开始。

不必用明文指定凭证,而是可以像上面的示例一样对凭证进行 xor 编码处理。注意,这实际上不算是加密,而且很容易推算出密码 — 其目的只是不用明文存储密码,让偷看管理员操作的人更难记住密码。如果目录服务器允许匿名访问,那么可以在 zero.config 中删除 jndiSecurityPrinciple 和 jndiSecurityCredentials 参数;后面会详细讨论这个问题。

zero.config 文件中与 LDAP 用户服务相关的参数

Zero 允许使用 zero.config 中 /config/security/userservice 下面的参数(如下所示)配置 LDAP 用户服务。但是,并不需要设置所有参数,一些参数可以采用默认值。在下面几节中,我们将讨论 LDAP 用户服务配置中的要点。


表 2. zero.config 中的 LDAP 用户服务属性

默认值说明
registryTypefile 或 ldapfile为了使用 LDAP 用户服务,必须设置为 “ldap”。
jndiProviderUrlJNDI 提供者的 URL必需
jndiSecurityAuthenticationJNDI 使用的身份验证级别simple设置为 javax.naming.Context. SECURITY_AUTHENTICATION
jndiSecurityPrincipal管理员的主体在不允许匿名访问的目录服务器上是必需的。
jndiSecurityCredentials管理员的凭证(支持 xor)在不允许匿名访问的目录服务器上是必需的。
jndiInitialContextFactory初始上下文工厂名com.sun.jndi.ldap.LdapCtxFactory可选
ldapSearchScope搜索范围,设置为 javax.naming.directory.SearchControls. 0(SearchControls.OBJECT_SCOPE)、1(SearchControls.ONELEVEL_SCOPE)或 2(SearchControls.SUBTREE_SCOPE)2可选
ldapSearchTimeLimit以毫秒为单位的搜索时间限制,设置为 javax.naming.directory.SearchControls30000可选
ldapUserIdRdnPattern用户条目的 RDN 的模式。用户名嵌入在占位符 “{0}” 的位置。 如果搜索模式是固定的,这个属性就是必需的;如果模式不固定,就必须把它注释掉。它与 ldapUserIsBaseDN 组合在一起生成用户条目的 DN。
ldapUserIdSearchFilterPattern用户搜索过滤器的模式。用户名嵌入在占位符 “{0}” 的位置。(&(uid={0}) (objectclass=inetOrgPerson))如果搜索模式不固定,这个属性就是必需的,而且需要不同于默认设置的模式。
ldapUserIdBaseDnLDAP 用户服务开始搜索用户条目的根位置必需
ldapGroupAttributeType组名的属性类型cn可选
ldapGroupBaseDn组的基 DN必需
ldapGroupSearchFilterPattern用来搜索用户所属的组的过滤器。用户名嵌入在占位符 “{0}” 的位置。(&(uniqueMember={0}) (objectclass=groupOfUniqueNames))如果需要不同于默认设置的模式,这个属性就是必需的。
ignoreBaseDN这个布尔标志支持完全限定域名(FQDN)查找。如果是 false,就会禁用 FQDN 查找。true如果希望禁用完全限定域名查找,这个属性就是必需的。
fullBaseDNFilterPattern根据完全限定域名搜索用户所用的过滤器。(objectclass=*)如果需要不同于默认设置的模式,这个属性就是必需的。

注意:上表是到编写本文时配置参数的完整列表。最新的参数列表参见 Developer's Guide 的 Configuring the LDAP user service in the zero.config file 部分。

检验迁移是否成功

我们已经用工具配置了 LDAP 存储库并修改了配置,现在要确定这些修改可以正确地起作用。首先使用 Wizard 用户,这是前一篇文章中设置的现有用户。启动应用程序,请求 tips.groovy 并再次启动身份验证过程,从而确定 Wizard 能够添加和删除热门股票评论(见图 2)。


图 2. 作为 ‘wizards’ 组中的 Wizard 用户登录
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

图片看不清楚?请点击这里查看原图(大图)。

关闭浏览器并通过请求 tips.groovy 再次登录 — 但是,这一次使用用户 Alice(前一篇文章中设置的另一个用户)的身份。确认 Alice 只能看到股评列表(见 图 3)。


图 3. 作为 ‘pundits’ 组中的 Alice 用户登录
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

图片看不清楚?请点击这里查看原图(大图)。

到目前为止学到的 LDAP 知识

现在,已经配置了 LDAP 存储库,并把现有用户从基于文件的用户注册表迁移到了 LDAP 注册表。除了把用户迁移到新的存储库之外,还配置了应用程序,让它使用 LDAP 存储库作为用户个人信息和身份验证存储库。

使用 LDAP 对炒股人进行进一步分组

随着炒股人数量的增加,Wizard 希望把这些用户进一步分为五个组,这样他就可以根据用户所属的组提供不同质量的服务。因为在区分炒股人和专家时已经完成过相似的过程,所以这应该很容易完成。表 3 总结了调整结构之后的 LDAP 目录的用户和组映射。如果您希望继续按照本文进行实践,那么 下载 LDAP Data Interchange Format(LDIF)文件 myco.simple.ldif 并把它导入 LDAP 目录服务器。


表 3. 简单的目录示例中用户和组之间的映射
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

在 ou=group,o=hq,dc=myco,dc=com 下面定义 5 个组名:

sages

bards

oracles

savant

master

每个用户名属于一个组:

“mary” 和 “dan” 属于 “sages”。

“ryan” 和 “baxter” 属于 “bards”。

“bob” 和 “steve” 属于 “oracles”。

“tim” 和 “john” 属于 “savant”。

“ken” 和 “michael” 属于 “master”。


图 4. 简单的目录示例
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

为了使用刚才建立的组,我们介绍一下用来保护资源的角色(role)概念。因为这些新的组都与 ‘pundits’ 相关,我们可以通过使用角色而不是以前使用组的方法,利用这种分组保护资源。在 Project Zero 中,可以使用角色把一组用户和/或组集中在一个名称之下。在下面的配置中,我们做了两处小改动。第一个改动的地方是以前为 ‘pundits’ 或 ‘wizards’ 组的用户的 GET 方法设置安全规则的配置。现在,将为 ‘wizards’ 组或 ‘pundits’ 角色中的用户配置安全规则。‘pundits’ 角色由 ‘sages’、‘bards’、‘oracles’、‘savant’ 和 ‘master’ 组组成。如果以后需要把用户进一步分组到其他 ‘pundits’ 类型的组中,那么只需在 zero.config 中更新 ‘pundits’ 角色,让它包含新的组,而不需要修改代码。


清单 2. 更新 zero.config 以使用角色概念
/config/http/port=8080 
 
/config/security/realm="Private Hot Stock Tips" 
/config/security/roles/pundits/groups=["sages", "bards", "oracles", "savant", "master"] 
 
@include "security/form.config"{ 
  "formLoginPage" : "/login.html" 
} 
@include "security/rule.config"{ 
  "conditions": "(/request/path =~ tips.groovy(/.*)?) && (/request/method == GET)", 
  "authType":"Form", 
  "groups":["wizards"], 
  "roles": ["pundits"] 
} 
@include "security/rule.config"{ 
  "conditions": "(/request/path =~ tips.groovy(/.*)?) && (/request/method == POST)", 
  "authType":"Form", 
  "groups":["wizards"] 
} 

下面的 清单 3 也有一处小改动,groovy 代码从使用组改为使用角色。本系列的 前一篇文章(“编程式授权” 小节)概述了请求对象的两个重要属性 ‘groups’ 和 ‘remoteUser’。请求对象的第三个属性称为 ‘roles’,它包含用户所属的角色的列表(应用的规则与 ‘groups’ 相似);在这个示例中,用户只属于一个角色。


清单 3. 更新股评,根据组和角色显示不同的视图
if(request.auth.subject.groups[].contains("wizards")){ 
 request.view = 'wizards.gt'; 
} else if(request.auth.subject.roles[].contains("pundits")){ 
 request.view = 'pundits.gt'; 
} else request.view = 'tips.gt'; 

检验调整结构之后的 LDAP 存储库

我们已经用工具配置了 LDAP 存储库并修改了配置,现在要确定这些修改是正确的。目前,‘Wizard’ 用户应该能够添加和删除热门股评,而 ‘pundits’ 角色中列出的组的成员应该能够看到股票列表。建议您检验修改的实际效果,以便进一步体会每个修改对应用程序的影响。下一节 “到目前为止学到的 LDAP 知识” 总结了这些要点。

到目前为止学到的 LDAP 知识

目前,已经调整了 LDAP 存储库的结构,将用户与新的组关联起来了。还介绍了角色的概念,并利用它避免在 ‘pundits’ 角色中添加新组时更新应用程序代码。

复杂的 LDAP 目录

在 图 2 所示的简单目录中,用户和组位于同一个子树中,但是在真实的生产系统中目录常常没这么简单。现在来研究一个稍微复杂一点儿的目录。图 5 给出这个目录示例,可以通过 下载 并导入 LDIF 文件 myco.complicated.ldif 来创建它。以前面的简单目录示例为起点,将专家转移到这个 LDIF 文件定义的另一个搜索组中(见 表 4):

在 ou=people,o=branch,o=hq,dc=myco,dc=com 下面定义一个用户。

用户名 wizard,密码 wizard_pwd

在 ou=group,o=branch,o=hq,dc=myco,dc=com 下面定义一个组。

wizards

“wizard” 属于 “wizards”

如果使用 清单 2 所示的 LDAP 用户服务配置,就无法用 ‘wizard’ 登录,但是仍然可以用前一个示例中定义的 10 个用户登录。原因在于,ldapUserIdRdnPattern 指定的模板 “uid={0}” 和 ldapUserIdBaseDn 指定的搜索根 ou=people,o=hq,dc=myco,dc=com 与 ‘wizards’ 组中专家的 DN 不匹配。那么,应该怎么配置呢?
图 5. 复杂的目录示例
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

表 4. 复杂的目录示例中用户和组之间的映射
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

固定模式和不固定模式

LDAP 用户服务中用户和组条目的默认定义
在默认情况下,LDAP 用户服务对于用户条目使用对象类 inetOrgPerson,对于用户名使用 uid 属性,对于组条目使用对象类 groupOfUniqueNames,对于组名使用 cn 属性。配置参数 ldapUserIdSearchFilterPattern、ldapGroupAttributeType 和 ldapGroupSearchFilterPattern 依赖于这些默认设置。

为了在目录搜索中寻找 ‘wizard’,应该在 zero.config 中使用 清单 4 所示的用户服务 ldap 部分。注意,用户搜索只需要 ldapUserIdBaseDn 参数,不再需要 ldapUserIdRdnPattern。用户服务用默认的搜索过滤器 o=hq,dc=myco,dc=com 搜索目录,这样就可以在 ou=people,o=branch,o=hq,dc=myco,dc=com 下面找到 ‘wizard’,在 ou=people,o=hq,dc=myco,dc=com 下面找到 10 个用户。

这种搜索过滤器和 ldapUserIdBaseDn 称为不固定模式(flex mode),而用 ldapUserIdRdnPattern 和 ldapUserIdBaseDn 执行的搜索称为固定模式(fixed mode)。固定模式是基本的用户搜索。ldapUserIdDnPattern 的定义非常简单明了,不需要高级 LDAP 技能。对于所有用户都定义在一个目录分支中的简单目录,可以使用固定模式;但是,对于用户分布在多个分支中的目录(如 图 2 所示),就不可能用固定模式来搜索。在这种情况下,应该使用不固定模式。在不固定模式下,在 zero.config 中只有一个必须配置的参数 ldapUserIdBaseDn;但是,如果 LDAP 目录对于用户和组定义使用与用户服务的默认设置不同的对象类和属性,就需要为 ldapUserIdSearchFilterPattern 参数指定一个定制的搜索过滤器。在本文后面的 “深入讨论 zero.config 的修改” 一节中将进一步讨论定制的搜索过滤器。


清单 4. zero.config 片段 — 复杂目录示例的用户服务配置
 
/config/security/userservice/registryType="ldap" 
 /config/security/userservice/ldap += { 
  "jndiProviderUrl":"ldap://localhost:10389/", 
  "jndiSecurityPrincipal":"uid=admin,ou=system", 
  "jndiSecurityCredentials":"<xor>LDo8LTor", 
  "ldapUserIdBaseDn":"o=hq,dc=myco,dc=com", 
  "ldapGroupBaseDn":"o=hq,dc=myco,dc=com"  
} 

到目前为止学到的 LDAP 知识

目前,已经调整了 LDAP 存储库的结构,将用户与新的组关联起来了。另外,还了解了 LDAP 的不固定模式和固定模式之间的差异。还看到了如何修改 Zero 的配置来支持这些修改,这可能很有用,因为常常会遇到比前面示例中的简单情况更复杂的 LDAP 存储库。

匿名 LDAP 目录访问

LDAP 目录服务器有时候允许匿名访问。在这种情况下,LDAP 客户机可以把身份验证委托给 LDAP 服务器,而不需要提供管理员的主体和凭证。LDAP 用户服务是 LDAP 客户机的一种实现,它可以匿名访问目录服务器。

如果一个目录服务器包含 图 1 所示的目录并允许匿名访问,那么应该在 zero.config 中添加 清单 5 中的用户服务配置。这段配置与 清单 4 相同,但是没有 jndiSecurityPrincipal 和 jndiSecurityCredentials 的参数定义。如果不配置 jndiSecurityPrincipal 和 jndiSecurityCredentials,用户服务就会匿名访问目录服务器。


清单 5. zero.config 片段 — 匿名目录访问的用户服务配置
/config/security/userservice/registryType="ldap" 
/config/security/userservice/ldap += { 
  "jndiProviderUrl":"ldap://localhost:10389/", 
  "ldapUserIdBaseDn":"o=hq,dc=myco,dc=com", 
  "ldapGroupBaseDn":"o=hq,dc=myco,dc=com"  
} 

到目前为止学到的 LDAP 知识

刚才讨论了另一种流行的 LDAP 访问方式,匿名身份验证(anonymous authentication)。注意,尽管这种绑定方法更容易设置,但是不需要进行任何身份验证,就可以访问 LDAP 存储库。

深入讨论 zero.config 的修改

LDAP 的对象类是一种模式,它定义目录中的条目应该包含哪些属性。到目前为止,您已经看到了两个使用对象类的目录,它们使用用户服务的默认对象类来定义用户条目和组条目。在真实的生产系统中,对象类取决于 LDAP 目录的需求和设计,不一定使用用户服务的默认对象类。如果要使用非默认的对象类和属性,那么应该如何配置用户服务呢?我们现在来看一下。

假设有一个 图 3 所示的目录,可以用 LDIF 文件 myco.complicated.mail.ldif(下载 一节中提供了这个文件)构建这个目录。在这个目录中,用户和组的映射关系如 表 5 所示:

用户条目用默认对象类 inetOrgPerson 定义。但是,用户名是用 mail 属性存储的,而不是使用 uid 属性。

尽管在用户服务中 uid 是用来存储用户名的默认属性,而 mail 不是。

组条目用对象类 groupOfNames 定义,成员用户用 member 属性定义。

尽管在用户服务中 groupOfUniqueNames 是组条目的默认对象类,而 groupOfNames 不是。

尽管在用户服务中 uniqueMember 是用来存储成员用户的默认属性,而 member 不是。

显然,这个目录是用非默认的对象类和属性定义的。为了让用户服务能够访问采用非默认设置的目录,需要修改 zero.config 中的几个参数。

对于用户条目的非默认设置,必须修改参数 ldapUserIdSearchFilterPattern。ldapUserIdSearchFilterPattern 为搜索用户条目指定一个搜索过滤器,它的默认值是 (&(uid={0}) (objectclass=inetOrgPerson))。这个搜索过滤器指定的搜索条件是,用户条目的用户名用 uid 属性存储,条目本身用对象类 inetOrgPerson 定义。在这个目录示例中,用户名是用 mail 属性存储的。因此,这个参数应该改为 ldapUserIdSearchFilterPattern=(&(mail={0}) (objectclass=inetOrgPerson))。

对于组条目使用非默认对象类和属性的情况,必须修改参数 ldapGroupSearchFilterPattern。这个参数为搜索组条目指定一个搜索过滤器,它的默认值是 (&(uniqueMember={0}) (objectclass=groupOfUniqueNames))。这个过滤器指定的搜索条件是,组的成员用户名用 uniqueMember 属性存储,条目本身用对象类 groupOfUniqueNames 定义。在这个目录示例中,成员用户名是用 member 属性存储的,而组条目使用对象类 groupOfNames。因此,这个参数应该改为 ldapGroupSearchFilterPattern=(&(member={0}) (objectclass=groupOfNames))。

清单 6 给出搜索这个目录所需的配置片段。


图 6. 复杂目录示例,mail 属性作为用户名,groupOfNames 作为组的对象类
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

表 5. 复杂的目录示例中用户和组之间的映射
保持 Project Zero 和 WebSphere sMash 应用程序的安全性,第 2 部分: 使用 LDAP 进行身份验证和授权

清单 6. zero.config 片段 — 采用非默认设置的目录的用户服务配置(mail 属性作为用户名,groupOfNames 作为组的对象类)
 
/config/security/userservice/registryType="ldap"  
/config/security/userservice/ldap += { 
  "jndiProviderUrl":"ldap://localhost:10389/", 
  "jndiSecurityPrincipal":"uid=admin,ou=system", 
  "jndiSecurityCredentials":"<xor>LDo8LTor", 
  "ldapUserIdSearchFilterPattern :"(&(mail={0}) (objectclass=inetOrgPerson))" 
  "ldapUserIdBaseDn":"o=hq,dc=myco,dc=com", 
  "ldapGroupSearchFilterPattern":"(&(member={0}) (objectclass=groupOfNames))", 
  "ldapGroupBaseDn":"o=hq,dc=myco,dc=com"  
} 

到目前为止学到的 LDAP 知识

刚才讨论了如何让 LDAP 使用电子邮件地址替代用户名。因为在企业中电子邮件地址是另一种惟一标识符形式,所以这种配置也比较常用。

结束语

我们希望您已经掌握了在 Project Zero 中启用安全运行时所需的所有步骤,并了解了如何用 LDAP 保护您的应用程序。我们讨论了如何设置用户注册表以及扩展用户服务注册表的方法。请继续关注本系列的第 3 部分,该部分将会扩展这些概念,帮助您安全地使用 Project Zero。

本文示例源代码或素材下载

Tags:保持 Project Zero

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接