public interface SaslClient
作为客户端执行 SASL 身份验证。
诸如 LDAP 之类的协议库获取此类的实例,以便执行由特定 SASL 机制定义的身份验证。根据 SaslClient 实施的 SASL 机制,调用 SaslClient 实例过程中的方法挑战并创建响应。随着身份验证的进行,实例封装了 SASL 客户端身份验证交换的状态。
下面是 LDAP 库如何使用 SaslClient 的示例。它首先获取 SaslClient 的实例:
然后它可以继续使用客户端进行身份验证。例如,LDAP 库可能会按如下方式使用客户端:SaslClient sc = Sasl.createSaslClient(mechanisms, authorizationId, protocol, serverName, props, callbackHandler);
如果该机制有初始响应,库将调用// Get initial response and send to server byte[] response = (sc.hasInitialResponse() ? sc.evaluateChallenge(new byte[0]) : null); LdapResult res = ldap.sendBindRequest(dn, sc.getName(), response); while (!sc.isComplete() && (res.status == SASL_BIND_IN_PROGRESS || res.status == SUCCESS)) { response = sc.evaluateChallenge(res.getBytes()); if (res.status == SUCCESS) { // we're done; don't expect to send another BIND if (response != null) { throw new SaslException( "Protocol error: attempting to send response after completion"); } break; } res = ldap.sendBindRequest(dn, sc.getName(), response); } if (sc.isComplete() && res.status == SUCCESS) { String qop = (String) sc.getNegotiatedProperty(Sasl.QOP); if (qop != null && (qop.equalsIgnoreCase("auth-int") || qop.equalsIgnoreCase("auth-conf"))) { // Use SaslClient.wrap() and SaslClient.unwrap() for future // communication with server ldap.in = new SecureInputStream(sc, ldap.in); ldap.out = new SecureOutputStream(sc, ldap.out); } }
evaluateChallenge() 并发出空质询并获得初始响应。诸如 IMAP4 之类的协议不包含对服务的第一个身份验证命令的初始响应,因此无需先调用 hasInitialResponse() 或 evaluateChallenge() 即可启动身份验证。当服务响应命令时,它会发送一个初始质询。对于客户端先发送数据的 SASL 机制,服务应该发出没有数据的质询。然后,这将导致(在客户端)调用 evaluateChallenge() 并发出空挑战。
- 自从:
- 1.5
- 参见:
-
方法总结
修饰符和类型方法描述voiddispose()处理 SaslClient 可能使用的任何系统资源或安全敏感信息。byte[]evaluateChallenge(byte[] challenge) 评估挑战数据并生成响应。返回此 SASL 客户端的 IANA 注册机制名称。getNegotiatedProperty(String propName) 检索协商的属性。boolean确定此机制是否具有可选的初始响应。boolean确定身份验证交换是否已完成。byte[]unwrap(byte[] incoming, int offset, int len) 解包从服务接收到的字节数组。byte[]wrap(byte[] outgoing, int offset, int len) 包装要发送到服务的字节数组。
-
方法详情
-
getMechanismName
String getMechanismName()返回此 SASL 客户端的 IANA 注册机制名称。 (例如“CRAM-MD5”、“GSSAPI”)。- 返回:
- 表示 IANA 注册机制名称的非空字符串。
-
hasInitialResponse
boolean hasInitialResponse()确定此机制是否具有可选的初始响应。如果为真,则调用者应使用空数组调用evaluateChallenge()以获得初始响应。- 返回:
- 如果此机制有初始响应,则为真。
-
evaluateChallenge
评估挑战数据并生成响应。如果在身份验证过程中从服务收到质询,则调用此方法以准备适当的下一个响应以提交给服务。- 参数:
challenge- 从服务发送的非空质询。挑战数组的长度可能为零。- 返回:
- 发送到服务的可能为空的响应。如果质询伴随着“成功”状态并且质询仅包含客户端更新其状态的数据并且不需要向服务发送响应,则它为空。如果客户端要发送没有数据的响应,则响应是一个零长度字节数组。
- 抛出:
SaslException- 如果在处理质询或生成响应时发生错误。
-
isComplete
boolean isComplete()确定身份验证交换是否已完成。可以随时调用此方法,但通常,直到调用方从服务(以特定于协议的方式)接收到交换已完成的指示后,才会调用它。- 返回:
- 如果身份验证交换已完成,则为真;否则为假。
-
unwrap
解包从服务接收到的字节数组。只有在身份验证交换完成后(即,当isComplete()返回真时)并且只有在身份验证交换已协商完整性和/或隐私作为保护质量时,才能调用此方法;否则,将抛出IllegalStateException。incoming是 RFC 2222 中定义的 SASL 缓冲区的内容,没有表示长度的前导四个八位字节字段。offset和len指定要使用的incoming部分。- 参数:
incoming- 包含来自服务的编码字节的非空字节数组。offset- 要使用的字节在incoming的起始位置。len- 要使用的incoming字节数。- 返回:
- 包含解码字节的非空字节数组。
- 抛出:
SaslException- 如果incoming无法成功展开。IllegalStateException- 如果身份验证交换尚未完成,或者如果协商的保护质量既不完整也不隐私。
-
wrap
包装要发送到服务的字节数组。只有在身份验证交换完成后(即,当isComplete()返回真时)并且只有在身份验证交换已协商完整性和/或隐私作为保护质量时,才能调用此方法;否则,将抛出IllegalStateException。此方法的结果将组成 SASL 缓冲区的内容,如 RFC 2222 中所定义,没有表示长度的前导四个八位字节字段。
offset和len指定要使用的outgoing部分。- 参数:
outgoing- 包含要编码的字节的非空字节数组。offset- 要使用的字节在outgoing的起始位置。len- 要使用的outgoing字节数。- 返回:
- 包含编码字节的非空字节数组。
- 抛出:
SaslException- 如果outgoing无法成功包装。IllegalStateException- 如果身份验证交换尚未完成,或者如果协商的保护质量既不完整也不隐私。
-
getNegotiatedProperty
检索协商的属性。此方法只能在身份验证交换完成后调用(即当isComplete()返回真时);否则,将抛出IllegalStateException。Sasl类包括几个众所周知的属性名称(例如,Sasl.QOP)。 SASL 提供程序可以支持特定于供应商和/或机制的其他属性。- 参数:
propName- 非空属性名称。- 返回:
- 协商属性值。如果为空,则该属性未协商或不适用于此机制。
- 抛出:
IllegalStateException- 如果此身份验证交换尚未完成
-
dispose
处理 SaslClient 可能使用的任何系统资源或安全敏感信息。调用此方法会使 SaslClient 实例无效。这个方法是幂等的。- 抛出:
SaslException- 如果在处置资源时遇到问题。
-