开发 UserRegistry 接口以使用定制注册表
实现该接口使 WebSphere® Application Server 安全性能够使用定制注册表。此功能将扩展 java.rmi 文件。使用远程注册表,您可以远程完成此处理。
关于此任务
提供以下方法的实现。
过程
- 使用 initialize(java.util.Properties) 初始化 UserRegistry 方法。
调用此方法初始化 UserRegistry 方法。“定制用户注册表”面板中定义的所有属性将传播至此方法。public void initialize(java.util.Properties props) throws CustomRegistryException, RemoteException;
对于 FileRegistrySample.java 样本文件,此初始化方法检索包含用户和组信息的注册表文件的名称。
服务器启动期间将调用此方法以初始化注册表。当启用安全性时,由管理控制台执行验证时也调用此方法。此方法与 V4.x 中的方法保持相同。
- 使用 checkPassword(String,String) 认证用户。
当用户使用名称或用户标识和密码登录时,将调用 checkPassword 方法以认证用户。此方法返回一个字符串,大多数情况下是用户安全性名称。将为该用户创建凭证以便授权。还会对 getCallerPrincipal 企业 Bean 调用和 servlet 调用 getUserPrincipal 和 getRemoteUser 方法返回此用户名。如果注册表中包含显示名,那么请参阅 getUserDisplayName 以获取更多信息。在某些情况下,如果返回的用户不是登录的用户,那么必须验证该用户在注册表中是否有效。public String checkPassword(String userSecurityName, String password) throws PasswordCheckFailedException CustomRegistryException, RemoteException;
对于 FileRegistrySample.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 应用程序,当应用程序的 web.xml 文件中认证约束设置为 CLIENT-CERT 时,调用此方法会将证书映射至注册表中有效的用户。对于 Java™ 客户机,当使用传输层认证时,将调用此方法以映射传输层中的客户机证书。当使用 CSIv2 认证协议将身份断言设置为包含证书时,将调用此方法以将证书映射至有效用户。
在 WebSphere Application Server V4.x 中,输入参数是 X509Certificate 证书。在 WebSphere Application Server V5.x 及更高版本中,此参数更改为接受一组 X509Certificate 证书(如证书链)。在 V4.x 中,仅对 Web 应用程序调用此参数,但在 V5.x 及更高版本中,可对 Web 客户机和 Java 客户机调用此方法。
- 使用 getRealm 获取安全领域名。
调用 getRealm 方法获取安全领域的名称。领域名称识别了注册表认证用户的安全域。如果此方法返回空值,那么使用 customRealm 缺省名称。public String getRealm() throws CustomRegistryException, RemoteException;
对于 FileRegistrySample.java 样本文件,getRealm 方法将返回 customRealm 字符串。在验证用户注册表信息时,将调用此方法。此方法与 V4.x 中的方法相同。
- 使用 getUsers(String,int) 从注册表获取用户列表。
getUsers 方法返回注册表中的用户列表。用户名取决于模式参数。用户数由 limit 参数限定。在具有多个用户的注册表中,获取所有用户是不实际的。因此,引入 limit 参数来限定从注册表中检索的用户数。limit 设置为 0 意味着返回所有与该模式相匹配的用户,并且可能导致大注册表的问题。谨慎使用此 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 V4.x 中,此方法指定仅采用模式参数。返回的是一个列表。在 WebSphere Application Server V5.x 或更高版本中,此方法更改为采用一个附加的 limit 参数。理论上,您的实现应该更改为采用 limit 值并限定返回的用户数。返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。当返回列表时,使用 Result.setList(List) 方法在 Result 对象中设置该列表。如果存在的条目比 limit 参数中请求的条目多,那么使用 Result.setHasMore 方法将 Result 对象中的布尔属性设置为 true。Result 对象中的布尔属性的缺省值是 false。
- 使用 getUserDisplayName(String) 获取用户的显示名。
getUserDisplayName 方法返回用户的显示名(如果存在的话)。显示名是描述用户的可选字符串,可以在某些注册表中设置。这是用户的描述性名称,并且它在注册表中不必是唯一的。public String getUserDisplayName(String userSecurityName) throws EntryNotFoundException, CustomRegistryException, RemoteException;
例如,在 IBM® i 系统中,可显示用户概要文件的文本描述。
例如,在 Windows 系统中,可以显示用户的全名。
如果注册表中不需要显示名,那么为该方法返回空或空字符串。
在 WebSphere Application Server V4.x 中,如果存在任何用户的显示名,那么这些名称对于 Enterprise 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 参数以限定从用户注册表中检索的组数。limit 设置为 0 意味着返回所有与该模式相匹配的组,并且对于大型用户注册表可能会导致问题。谨慎使用此 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 V4 中,此方法仅采用模式参数,并且返回一个列表。 在 WebSphere Application Server V5.x 或更高版本中,此方法更改为采用 limit 参数。更改为采用 limit 值并限定返回的用户数。返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。使用 Result.setList(List) 方法在 Result 对象中设置该列表。如果存在的条目比 limit 参数中请求的条目多,那么使用 Result.setHasMore 方法将 Result 对象中的布尔属性设置为 true。Result 对象中的布尔属性的缺省值是 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 标识的所有组的唯一标识。创建用户凭证时调用此方法。当对组授予对资源的访问权时,作为创建凭证的一部分,将收集该用户所属的所有 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 参数的限定。limit 设置为 0 指示返回该组中的所有用户。此方法不由 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 属性。此列表包含返回的用户和布尔标志,该标识指示用户注册表中是否还有其他用户与搜索模式相匹配。此布尔标志向客户机指示用户注册表中是否有可用用户。
在此示例中,如果 limit 参数未设置为 0,此方法将比组的请求用户数多获取一个用户。如果该方法成功地多获取了一个用户,那么布尔标志设置为 true。
在 WebSphere Application Server V4 中,该产品必须使用此 getUsers 方法。对于 WebSphere Application Server V5.x 或更高版本,此方法可在无法获取所请求的用户集的情况下创建 NotImplementedException 异常。但是,仅应在极少情况下创建此异常,这是因为它会影响其他组件。在 V4 中,此方法仅接受模式参数并返回列表。在 V5 中,此方法接受 limit 参数。更改实现以采用 limit 值并限定返回的用户数。返回更改为返回 Result 对象,该对象由列表和指示是否存在其他条目的标志组成。当返回列表时,使用 Result.setList(List) 方法在 Result 对象中设置该列表。如果存储的条目比 limit 参数中请求的条目多,那么使用 Result.setHasMore 方法将 Result 对象中的布尔属性设置为 true。Result 对象中的布尔属性的缺省值是 false。
- 实现 createCredential(String) 方法。 注意: 为便于显示,以下代码样本中的前两行将会分开。
在 WebSphere Application Server 的此发行版中,不会调用 createCredential 方法。可以返回 null。在此示例中,将返回 null 值。public com.ibm.websphere.security.cred.WSCredential createCredential(String userSecurityName) throws NotImplementedException, EntryNotFoundException, CustomRegistryException, RemoteException;
下一步做什么


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_users
文件名:tsec_users.html