javax.security.sasl

接口
异常
public interface SaslServer

以服务器的身份执行 SASL 验证。

为了执行具体 SASL 机制所定义的验证,服务器(例如 LDAP 服务器)要获得此类的一个实例。调用 SaslServer 实例上的方法可生成与 SaslServer 所实现的 SASL 机制相对应的 challenge。随着验证的进行,该实例会封装 SASL 服务器的验证交换状态。

以下是 LDAP 服务器如何使用 SaslServer 的一个示例。它首先为客户端请求的 SASL 机制获得一个 SaslServer 实例:

 SaslServer ss = Sasl.createSaslServer(mechanism,
     "ldap", myFQDN, props, callbackHandler);
然后可继续为验证使用该服务器。例如,假设 LDAP 服务器接收到一个 LDAP BIND 请求,其中包含 SASL 机制的名称和(可选的)初始响应。然后它可按如下方式使用服务器:
 while (!ss.isComplete()) {
     try {
         byte[] challenge = ss.evaluateResponse(response);
         if (ss.isComplete()) {
             status = ldap.sendBindResponse(mechanism, challenge, SUCCESS);
         } else {
             status = ldap.sendBindResponse(mechanism, challenge, 
                   SASL_BIND_IN_PROGRESS);
             response = ldap.readBindRequest();
         }
     } catch (SaslException e) {
            status = ldap.sendErrorResponse(e);
            break;
     }
 }
 if (ss.isComplete() && status == SUCCESS) {
    String qop = (String) sc.getNegotiatedProperty(Sasl.QOP);
    if (qop != null 
        && (qop.equalsIgnoreCase("auth-int") 
            || qop.equalsIgnoreCase("auth-conf"))) {

      // Use SaslServer.wrap() and SaslServer.unwrap() for future
      // communication with client
        ldap.in = new SecureInputStream(ss, ldap.in);
        ldap.out = new SecureOutputStream(ss, ldap.out);
    }
 }

从以下版本开始:
1.5
另请参见:
Sasl, SaslServerFactory

方法摘要
 void dispose()
          处置 SaslServer 可能使用的所有系统资源或安全敏感信息。
 byte[] evaluateResponse(byte[] response)
          评估响应数据并生成一个 challenge。
 String getAuthorizationID()
          报告此会话客户端的有效授权 ID。
 String getMechanismName()
          返回此 SASL 服务器的 IANA 注册机制名。
 Object getNegotiatedProperty(String propName)
          获取已协商的属性。
 boolean isComplete()
          确定验证交换是否已完成。
 byte[] unwrap(byte[] incoming, int offset, int len)
          解包接收自客户端的 byte 数组。
 byte[] wrap(byte[] outgoing, int offset, int len)
          包装要发送到客户端的 byte 数组。
 

方法详细信息

getMechanismName

String getMechanismName()
返回此 SASL 服务器的 IANA 注册机制名。(例如 "CRAM-MD5"、"GSSAPI")。

返回:
表示 IANA 注册机制名的非 null 字符串。

evaluateResponse

byte[] evaluateResponse(byte[] response)
                        throws SaslException
评估响应数据并生成一个 challenge。 如果在验证处理期间接收到客户端的响应,则调用此方法来准备要提交给客户端的下一个合适 challenge。如果验证已成功并且没有其他 challenge 数据要发送给客户端,则 challenge 为 null。如果必须通过向客户端发送 challenge 来继续进行验证,或者如果验证已成功但客户端需要处理 challenge 数据,则 challenge 是非 null 的。每次调用 evaluateResponse() 后都应该调用 isComplete() 来确定是否还需要客户端的进一步响应。

参数:
response - 客户端发送的非 null(但可能为空)响应。
返回:
要发送给客户端的 challenge,可能为 null。如果验证已成功并且没有其他 challenge 数据要发送给客户端,则 challenge 为 null。
抛出:
SaslException - 如果处理响应或生成 challenge 时发生错误。

isComplete

boolean isComplete()
确定验证交换是否已完成。通常在每次调用 evaluateResponse() 后调用此方法来确定验证是否已成功完成,还是应该继续进行。

返回:
如果验证交换已完成,则返回 true;否则返回 false。

getAuthorizationID

String getAuthorizationID()
报告此会话客户端的有效授权 ID。仅在 isComplete() 返回 true 时才可调用此方法。

返回:
客户端的授权 ID。
抛出:
IllegalStateException - 如果未完成此次验证会话

unwrap

byte[] unwrap(byte[] incoming,
              int offset,
              int len)
              throws SaslException
解包接收自客户端的 byte 数组。仅在验证交换已完成(即 isComplete() 返回 true)后,并且仅在验证交换已经协商将完整性和/或机密性作为保护级别时才调用此方法;否则会抛出 IllegalStateException

incoming 是 SASL 缓冲区的内容(在 RFC 2222 中定义),没有表示长度的前导 4 个八位组字段。offsetlen 指定了要使用的 incoming 部分。

参数:
incoming - 非 null 的 byte 数组,包含取自客户端的已编码字节。
offset - 所用字节在 incoming 中的开始位置。
len - 使用 incoming 中的字节数。
返回:
包含已解码字节的非 null byte 数组。
抛出:
SaslException - 如果无法成功解包 incoming
IllegalStateException - 如果验证交换未完成,如果协商的保护级别既没有完整性,也没有机密性

wrap

byte[] wrap(byte[] outgoing,
            int offset,
            int len)
            throws SaslException
包装要发送到客户端的 byte 数组。仅在验证交换已完成(即 isComplete() 返回 true)后,并且仅在验证交换已经协商将完整性和/或机密性作为保护级别时才调用此方法;否则会抛出 SaslException

此方法的结果会组成 SASL 缓冲区的内容(在 RFC 2222 中定义),没有表示长度的前导 4 个八位组字段。offsetlen 指定了要使用的 outgoing 部分。

参数:
outgoing - 非 null 的 byte 数组,包含要编码的字节。
offset - 所用字节在 outgoing 中的开始位置。
len - 使用 outgoing 中的字节数。
返回:
包含已编码字节的非 null byte 数组。
抛出:
SaslException - 如果无法成功包装 outgoing
IllegalStateException - 如果验证交换未完成,如果协商的保护级别既没有完整性,也没有机密性。

getNegotiatedProperty

Object getNegotiatedProperty(String propName)
获取已协商的属性。仅在验证交换已完成后(即当 isComplete() 返回 true)才调用此方法;否则会抛出 IllegalStateException

参数:
propName - 属性
返回:
已协商属性的值。如果为 null,则未协商该属性,或者该属性不适用于此机制。
抛出:
IllegalStateException - 如果未完成此验证交换

dispose

void dispose()
             throws SaslException
处置 SaslServer 可能使用的所有系统资源或安全敏感信息。调用此方法会使 SaslServer 实例失效。此方法是幂等的。

抛出:
SaslException - 如果释放资源时遇到问题。