public interface SaslClient
诸如LDAP之类的协议库获取此类的实例,以执行由特定SASL机制定义的认证。 调用SaslClient
实例过程的方法,并根据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()
情况下hasInitialResponse()
evaluateChallenge()
。
当服务器响应该命令时,它发送初始挑战。
对于客户端首先发送数据的SASL机制,服务器应该发出无数据的挑战。
这将导致一个呼叫(在客户端)到evaluateChallenge()
一个空的挑战。
Sasl
, SaslClientFactory
Modifier and Type | Method and Description |
---|---|
void |
dispose()
处理SaslClient可能使用的任何系统资源或安全敏感信息。
|
byte[] |
evaluateChallenge(byte[] challenge)
评估挑战数据并产生响应。
|
String |
getMechanismName()
返回此SASL客户端的IANA注册机制名称。
|
Object |
getNegotiatedProperty(String propName)
检索谈判的财产。
|
boolean |
hasInitialResponse()
确定此机制是否具有可选的初始响应。
|
boolean |
isComplete()
确定认证交换是否已完成。
|
byte[] |
unwrap(byte[] incoming, int offset, int len)
解开从服务器接收的字节数组。
|
byte[] |
wrap(byte[] outgoing, int offset, int len)
包装要发送到服务器的字节数组。
|
String getMechanismName()
boolean hasInitialResponse()
evaluateChallenge()
以获取初始响应。
byte[] evaluateChallenge(byte[] challenge) throws SaslException
challenge
- 从服务器发送的非空挑战。
挑战阵列可能具有零长度。
SaslException
- 如果在处理挑战或产生响应时发生错误。
boolean isComplete()
byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException
isComplete()
返回true时),并且只有认证交换协商完整性和/或隐私作为保护质量,才可以调用此方法。
否则,抛出一个IllegalStateException
。
incoming
是RFC 2222中定义的SASL缓冲区的内容,没有表示长度的前四个八位字节字段。 offset
和len
指定要使用的部分incoming
。
incoming
- 包含服务器编码字节的非空字节数组。
offset
- 起始位置在
incoming
的字节使用。
len
- 从
incoming
使用的字节数。
SaslException
- 如果
incoming
无法成功解包。
IllegalStateException
- 如果验证交换尚未完成,或者协商的保护质量既不完整也不具有隐私。
byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException
isComplete()
返回true时),只有认证交换协商完整性和/或隐私作为保护质量,才可以调用此方法。
否则,抛出IllegalStateException
。
该方法的结果将构成RFC 2222中定义的SASL缓冲区的内容,而不包含表示长度的前导四个八位字节字段。 offset
和len
指定要使用的部分outgoing
。
outgoing
- 包含要编码的字节的非空字节数组。
offset
- 起始位置在
outgoing
的字节使用。
len
- 从
outgoing
使用的字节数。
SaslException
- 如果
outgoing
无法成功包装。
IllegalStateException
- 如果认证交换尚未完成,或者协商的保护质量既没有完整性也没有隐私。
Object getNegotiatedProperty(String propName)
isComplete()
返回true时)。
否则,抛出一个IllegalStateException
。
propName
- 非空属性名称。
IllegalStateException
- 如果此认证交换尚未完成
void dispose() throws SaslException
SaslException
- 处理资源时遇到问题。