开发 UserRegistry 接口以使用定制注册表
实现此接口将使 WebSphere® Application Server 安全性能够使用定制注册表。 此功能扩展了java.rmi中。 使用远程注册表,您可以远程完成此处理。
有关此任务
提供以下方法的实现。
过程
- 使用 initialize(java.util.Properties) 初始化 UserRegistry 方法。
调用此方法初始化 UserRegistry 方法。 “定制用户注册表”面板中定义的所有属性将传播至此方法。public void initialize(java.util.Properties props) throws CustomRegistryException, RemoteException;for theFileRegistrySample.java样本文件,初始化方法检索包含用户和组信息的注册表文件的名称。
服务器启动期间将调用此方法以初始化注册表。 当启用安全性时,由管理控制台执行验证时也调用此方法。 此方法与 V4.x 中的方法保持相同。
- 使用 checkPassword(String,String) 认证用户。
当用户使用名称或用户标识和密码登录时,将调用 checkPassword 方法以认证用户。 此方法返回一个字符串,大多数情况下是用户安全性名称。 将为该用户创建凭证以便授权。 还会对 getCallerPrincipal 企业 Bean 调用和 servlet 调用 getUserPrincipal 和 getRemoteUser 方法返回此用户名。 如果注册表中包含显示名,那么请参阅 getUserDisplayName 以获取更多信息。 在某些情况下,如果返回的用户不是登录的用户,那么必须验证该用户在注册表中是否有效。public String checkPassword(String userSecurityName, String password) throws PasswordCheckFailedException CustomRegistryException, RemoteException;for theFileRegistrySample.java样本文件, mapCertificate 方法从证书链中获取专有名称 (DN) ,并在返回用户之前确保它是注册表中的有效用户。 对于此样本,checkPassword 方法将检查用户注册表中的名称和密码组合,并且(如果它们匹配)返回要认证的用户。
将对各种方案调用此方法,例如,在初始化用户注册表之后通过管理控制台来验证用户信息。 当您访问该产品中的受保护资源并且在继续授权之前,也将调用此方法以认证该用户。 此方法与 V4.x 中的方法相同。
- 使用 mapCertificate(X509Certificate[]) 从 X.509 证书获取用户名。
将调用 mapCertificate 方法以从浏览器提供的 X.509 证书链获取用户名。 完整的证书链传递到该方法,并且,实现可以验证此链(如果需要的话)和获取用户信息。 接着,为此用户创建凭证以进行授权。 如果您的配置不支持浏览器证书,那么会创建 CertificateMapNotSupportedException 异常。 如果提问类型是证书,即使浏览器中有有效的证书,不支持证书的结果也会是认证失败。public String mapCertificate(X509Certificate[] cert) throws CertificateMapNotSupportedException, CertificateMapFailedException, CustomRegistryException, RemoteException;为认证提供证书时调用此方法。 对于 Web 应用程序,当认证约束设置为 CLIENT-CERT 时,web.xml应用程序的文件,将调用此方法以将证书映射到注册表中的有效用户。 对于 Java™ 客户机,当使用传输层认证时,将调用此方法以映射传输层中的客户机证书。 当使用 CSIv2 认证协议将身份断言设置为包含证书时,将调用此方法以将证书映射至有效用户。
在 WebSphere Application Server V 4.x中,输入参数是 X509Certificate 证书。 在 WebSphere Application Server V 5.x 及更高版本中,此参数更改为接受 X509Certificate 证书的数组,例如证书链。 在 V 4.x中,仅针对 Web 应用程序调用此参数,但在 V 5.x 和更高版本中,您可以针对 Web 客户机和 Java 客户机调用此方法。
- 使用 getRealm 获取安全领域名。
调用 getRealm 方法获取安全领域的名称。 领域名称识别了注册表认证用户的安全域。 如果此方法返回空值,那么使用 customRealm 缺省名称。public String getRealm() throws CustomRegistryException, RemoteException;for theFileRegistrySample.java样本文件, getRealm 方法返回 customRealm 字符串。 在验证用户注册表信息时,将调用此方法。 此方法与 V4.x 中的方法相同。
- 使用 getUsers(String,int) 从注册表获取用户列表。
getUsers 方法返回注册表中的用户列表。 用户名取决于模式参数。 用户数由 limit 参数限定。 在具有多个用户的注册表中,获取所有用户是不实际的。 因此,引入 limit 参数来限定从注册表中检索的用户数。public Result getUsers(String pattern, int limit) throws CustomRegistryException, RemoteException;期望定制注册表实现至少支持通配符搜索 (*)。 例如,模式星号 (*) 返回所有用户,模式 (b *) 返回以 b开头的用户。
返回参数是具有 com.ibm.websphere.security.Result 类型的对象。 此对象包含两个属性:java.util.List 和 java.lang.boolean 属性。 该列表包含返回的用户,并且布尔标志指示用户注册表中是否还有其他用户与搜索模式相匹配。 此布尔标志用于向客户机表明,在注册表中是否有更多的可用用户。
在FileRegistrySample.java样本文件, getUsers 方法从用户注册表中检索所需的用户数,并将其设置为 Result 对象中的列表。 要了解是否存在比请求的用户更多的用户,样本将获得比请求的用户更多的用户,如果发现其他用户,那么将布尔标志设置为true.对于模式匹配,使用 RegExpSample 类中的匹配方法,该方法支持星号(*)和问号(?)等通配符。
管理控制台调用此方法,以在各种将用户映射至角色面板中将用户添加至角色。 管理控制台使用 Result 对象中设置的布尔值以指示用户注册表中存在与模式相匹配的其他条目。
在 WebSphere Application Server V 4.x中,此方法指定仅采用模式参数。 返回的是一个列表。 在 WebSphere Application Server V 5.x 或更高版本中,此方法将更改为采用一个附加参数 (即限制)。 理论上,您的实现应该更改为采用 limit 值并限定返回的用户数。 返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。 当返回列表时,使用 Result.setList(List) 方法在 Result 对象中设置该列表。 如果存在比 limit 参数中请求的条目更多的条目,请将 Boolean 属性设置为true在结果对象中,使用 Result.setHasMore 方法。 结果对象中布尔属性的缺省值为false.
- 使用 getUserDisplayName(String) 获取用户的显示名。
getUserDisplayName 方法返回用户的显示名(如果存在的话)。 显示名是描述用户的可选字符串,可以在某些注册表中设置。 这是用户的描述性名称,并且它在注册表中不必是唯一的。public String getUserDisplayName(String userSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;例如,在 IBM® i 系统中,可以显示用户概要文件的文本描述。
例如,在 Windows 系统中,可以显示用户的全名。
如果注册表中不需要显示名,那么为该方法返回空或空字符串。
如果 WebSphere Application Server 版本 4.x 中存在任何用户的显示名称,这些名称对于企业 JavaBeans (EJB) 方法调用 getCallerPrincipal 以及 servlet 调用 getUserPrincipal 和 getRemoteUser 非常有用。 如果显示名与任何用户的安全名不同,那么将对上面提到的企业 Bean 和 servlet 方法返回显示名。 因为显示名在用户注册表中可能不是唯一的,对这些方法返回显示名在某些情况下可能会产生问题。 通过在此版本的产品中将缺省行为更改为返回用户安全名而不是用户显示名来避免此问题。 有关如何设置定制注册表的属性的更多信息,请参阅为定制注册表设置属性部分。
在FileRegistrySample.java样本文件,此方法返回其名称与提供的用户名匹配的用户的显示名称。 如果该显示名不存在,那么此方法将返回空字符串。
该产品可以调用此方法以在管理控制台中提供显示名,或通过使用命令行和 wsadmin 工具提供显示名。 此方法仅用于显示。 此方法与 V4.x 中的方法相同。
- 使用 getUniqueUserId(String) 获取用户的唯一标识。
此方法返回指定安全性名称的用户的唯一标识。public String getUniqueUserId(String userSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java该方法将返回用户名与提供的用户名相匹配的 uniqueUserId 值。 当形成用户凭证和创建应用程序的授权表时,调用此方法。
- 使用 getUserSecurityName(String) 获取用户的安全性名称。
此方法返回给定唯一标识的用户的安全性名称。 在FileRegistrySample.java样本文件,此方法返回唯一标识与所提供标识匹配的用户的安全名称。public String getUserSecurityName(String uniqueUserId) throws EntryNotFoundException, CustomRegistryException, RemoteException;调用此方法以确保存在给定 uniqueUserId 的有效用户。 当从令牌中获取 uniqueUserId 时,调用此方法以获得用户的安全性名称。
- 使用 isValidUser(String) 来检查给定用户在注册表中是否为有效的用户。
此方法表明给定用户在注册表中是否为有效的用户。public boolean isValidUser(String userSecurityName) throws CustomRegistryException, RemoteException;在FileRegistrySample.java样本文件,此方法返回true如果在注册表中找到用户,那么此方法将返回false. 此方法主要在知道用户是否存在于目录中防止以后出现问题的情况下调用。 例如,在 mapCertificate 调用中,从证书中获取名称时,如果发现该用户不是用户注册表中的有效用户,那么可以避免尝试为该用户创建凭证。
- 使用 getGroups(String,int) 从用户注册表返回组列表。
getGroups 方法返回用户注册表中的组列表。 组名取决于模式参数。 组数由 limit 参数限定。 在具有许多组的注册表中,获取所有组是不实际的。 因此,引入 limit 参数以限定从用户注册表中检索的组数。 期望定制注册表实现至少支持通配符搜索 (*)。 例如,模式星号 (*) 返回所有用户,模式 (b *) 返回以 b开头的用户。public Result getGroups(String pattern, int limit) throws CustomRegistryException, RemoteException;返回参数是 the com.ibm.websphere.security.Result 类型的对象。 此对象包含java.util.List和java.lang.boolean属性。 该列表包含返回的组,并且布尔标志指示用户注册表中是否包含与搜索到的模式相匹配的其他组。 此布尔标志用于向客户机表明,在注册表中是否有更多的可用组。
在FileRegistrySample.java样本文件, getUsers 方法从用户注册表中检索所需数量的组,并将它们设置为 Result 对象中的列表。 要了解是否存在比所请求的组更多的组,样本将获得比所请求的用户更多的一个用户,如果发现其他用户,那么将布尔标志设置为true.对于模式匹配,使用 RegExpSample 类中的匹配方法,该方法支持星号 (*) 和问号 (?) 字符。
管理控制台调用此方法,以在各种将组映射至角色面板中将组添加至角色。 管理控制台使用 Result 对象中设置的布尔值以指示用户注册表中存在与模式相匹配的其他条目。
在 WebSphere Application Server 版本 4 中,此方法仅用于获取模式参数并返回列表。 在 WebSphere Application Server V 5.x 或更高版本中,此方法已更改为采用 limit 参数。 更改为采用 limit 值并限定返回的用户数。 返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。 使用 Result.setList(List) 方法在 Result 对象中设置该列表。 如果存在比 limit 参数中请求的条目更多的条目,请将 Boolean 属性设置为true在 Result 对象中使用 Result.setHasMore 方法。 "结果" 对象中的布尔属性的缺省值为false.
- 使用 getGroupDisplayName(String) 获取组的显示名。
getGroupDisplayName 方法返回组的显示名(如果存在的话)。 显示名是描述可在某些用户注册表中设置的组的可选字符串。 该名称是组的描述性名称,并且它在注册表中不必是唯一的。 如果注册表中不需要组的显示名,那么对此方法将返回空或空字符串。public String getGroupDisplayName(String groupSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java样本文件,此方法返回其名称与所提供的组名相匹配的组的显示名称。 如果该显示名不存在,那么此方法将返回空字符串。
该产品可以调用此方法以在管理控制台中提供显示名,或通过命令行使用 wsadmin 工具提供显示名。 此方法仅用于显示。
- 使用 getUniqueGroupId(String) 获取组的唯一标识。
此方法返回指定安全性名称的组的唯一标识。public String getUniqueGroupId(String groupSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java样本文件,此方法返回其唯一标识与提供的标识匹配的组的安全名称。 此方法验证对给定 uniqueGroupId 标识是否存在有效组。
- 使用 getUniqueGroupIds(String) 获取用户所属的所有组的唯一标识。
此方法返回用户所属的所有组的唯一标识。public List getUniqueGroupIds(String uniqueUserId) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java该方法返回包含该 uniqueUserID ID 的所有组的唯一 ID。 创建用户凭证时调用此方法。 当对组授予对资源的访问权时,作为创建凭证的一部分,将收集该用户所属的所有 groupUniqueIds 标识并将它们放置到凭证中以便授权。
- 使用 getGroupSecurityName(String) 获取组的安全性名称。
此方法返回给定唯一标识的组的安全性名称。public String getGroupSecurityName(String uniqueGroupId) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java样本文件,此方法返回其唯一标识与提供的标识匹配的组的安全名称。 此方法验证对给定 uniqueGroupId 标识是否存在有效组。
- 使用 isValidGroup(String) 来确定在注册表中是否为有效的组。
此方法表明给定组在注册表中是否有效。public boolean isValidGroup(String groupSecurityName) throws CustomRegistryException, RemoteException;在FileRegistrySample.java样本文件,此方法返回true如果在注册表中找到组,那么该方法将返回false。在知道该组是否存在于目录中可能会阻止以后发生问题的情况下,可以使用此方法。
- 使用 getGroupsForUser(String) 获取用户所属的所有组。
此方法返回名称与提供的名称相匹配的用户所属的所有组。 此方法类似 getUniqueGroupIds 方法,除了使用安全性名称而不是唯一标识。public List getGroupsForUser(String userSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;在FileRegistrySample.java该方法会返回包含 userSecurityName 名称的所有组安全名称。
管理控制台或脚本编制工具调用此方法,以验证为 RunAs 角色输入的用户是否已经是用户和组至角色映射中该角色的一部分。 需要此检查以确保用户不能添加到 RunAs 角色,除非该用户被直接或间接地(通过包含此用户的组)指定给用户和组至角色映射中的角色。 因为该用户所属的组可能是用户和组至角色映射中的角色的一部分,所以调用此方法以检查此用户所属的任何组是否映射至该角色。
- 使用 getUsersForGroup(String,int) 从指定的组检索用户。
此方法从指定的组中检索用户。 返回的用户数受到 limit 参数的限定。 WebSphere Application Server 安全性组件不会直接调用此方法。 但是,其他组件可调用此方法。 有时如果您使用某个用户注册表而无法在该用户注册表中从任何组获取所有用户,那么可能会对特定组创建 NotImplementedException 异常。 在这种情况下,验证在安装了流程编排器的情况下是否未使用这些特定组对员工分配建模。 如果从用户注册表的组返回用户没什么问题,那么建议您在实现此方法时不要创建 NotImplemented 异常。public Result getUsersForGroup(String groupSecurityName, int limit) throws NotImplementedException, EntryNotFoundException, CustomRegistryException, RemoteException;返回参数是具有 com.ibm.websphere.security.Result 类型的对象。 此对象包含 java.util.List 属性和 java.lang.boolean 属性。 此列表包含返回的用户和布尔标志,该标识指示用户注册表中是否还有其他用户与搜索模式相匹配。 此布尔标志向客户机指示用户注册表中是否有可用用户。
在此示例中,此方法获取的一个用户超过组的请求用户数。 如果该方法成功再获取一个用户,那么布尔标志将设置为true.
在 WebSphere Application Server V 4 中,此 getUsers 方法对于产品是必需的。 对于 WebSphere Application Server V 5.x 或更高版本,此方法可以创建NotImplementedException在无法获取所请求的用户集的情况下发生异常。 但是,仅应在极少情况下创建此异常,这是因为它会影响其他组件。 在 V4 中,此方法仅接受模式参数并返回列表。 在 V5 中,此方法接受 limit 参数。 更改实现以采用 limit 值并限定返回的用户数。 返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。 当返回列表时,使用 Result.setList(List) 方法在 Result 对象中设置该列表。 如果限制参数中的条目数超过所请求的条目数,请将布尔值属性设置为true在 Result 对象中使用 Result.setHasMore 方法。 "结果" 对象中的布尔属性的缺省值为false.
- 实现 createCredential(String) 方法。注意: 以下代码样本的前两行仅为说明目的而拆分。
在此发行版的 WebSphere Application Server中,不会调用 createCredential 方法。 可以返回 null。 在此示例中,将返回 null 值。public com.ibm.websphere.security.cred.WSCredential createCredential(String userSecurityName) throws NotImplementedException, EntryNotFoundException, CustomRegistryException, RemoteException;