Interface SaslServer


public interface SaslServer
作为服务器执行SASL身份验证。

服务器(例如LDAP服务器)获取此类的实例以执行特定SASL机制定义的身份验证。在SaslServer实例上调用方法会根据SaslServer实现的SASL机制生成挑战。随着身份验证的进行,该实例封装了SASL服务器身份验证交换的状态。

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

 SaslServer ss = Sasl.createSaslServer(mechanism,
     "ldap", myFQDN, props, callbackHandler);
 
然后可以继续使用服务器进行身份验证。例如,假设LDAP服务器收到包含SASL机制名称和(可选的)初始响应的LDAP BIND请求。然后可能如下使用服务器:

 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"))) {

         // 使用SaslServer.wrap()和SaslServer.unwrap()进行将来与客户端的通信
         ldap.in = new SecureInputStream(ss, ldap.in);
         ldap.out = new SecureOutputStream(ss, ldap.out);
     }
 }
 
自版本:
1.5
参见:
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    处置SaslServer可能正在使用的任何系统资源或安全敏感信息。
    byte[]
    evaluateResponse(byte[] response)
    评估响应数据并生成挑战。
    报告此会话的客户端的授权ID。
    返回此SASL服务器的IANA注册机制名称。
    检索协商的属性。
    boolean
    确定身份验证交换是否已完成。
    byte[]
    unwrap(byte[] incoming, int offset, int len)
    从客户端接收的字节数组解包。
    byte[]
    wrap(byte[] outgoing, int offset, int len)
    将要发送到客户端的字节数组包装。
  • Method Details

    • getMechanismName

      String getMechanismName()
      返回此SASL服务器的IANA注册机制名称(例如"CRAM-MD5","GSSAPI")。
      返回:
      代表IANA注册机制名称的非空字符串。
    • evaluateResponse

      byte[] evaluateResponse(byte[] response) throws SaslException
      评估响应数据并生成挑战。如果在身份验证过程中从客户端接收到响应,则调用此方法准备适当的下一个挑战提交给客户端。如果身份验证成功且不需要向客户端发送更多挑战数据,则挑战为null。如果需要通过向客户端发送挑战继续身份验证,或者如果身份验证成功但需要客户端处理挑战数据,则挑战为非null。应在每次调用evaluateResponse()后调用isComplete(),以确定是否需要从客户端获取任何进一步的响应。
      参数:
      response - 客户端发送的非空(但可能为空)响应。
      返回:
      要发送给客户端的可能为null的挑战。如果身份验证成功且不需要向客户端发送更多挑战数据,则为null。
      抛出:
      SaslException - 处理响应或生成挑战时发生错误。
    • 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
      从客户端接收的字节数组解包。只有在身份验证交换完成后(即isComplete()返回true时)才能调用此方法,并且仅当身份验证交换已协商完整性和/或隐私作为保护质量时才能调用;否则将抛出IllegalStateException

      incoming是RFC 2222中定义的SASL缓冲区的内容,不包括表示长度的前导四个八位组字段。 offsetlen指定要使用的incoming的部分。

      参数:
      incoming - 包含来自客户端的编码字节的非空字节数组。
      offset - 要使用的incoming中的字节的起始位置。
      len - 要使用的incoming中的字节数。
      返回:
      包含解码字节的非空字节数组。
      抛出:
      SaslException - 如果无法成功解包incoming
      IllegalStateException - 如果身份验证交换尚未完成,或者协商的保护质量既没有完整性也没有隐私
    • wrap

      byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException
      将要发送到客户端的字节数组包装。只有在身份验证交换完成后(即isComplete()返回true时)才能调用此方法,并且仅当身份验证交换已协商完整性和/或隐私作为保护质量时才能调用;否则将抛出SaslException

      此方法的结果将组成RFC 2222中定义的SASL缓冲区的内容,不包括表示长度的前导四个八位组字段。 offsetlen指定要使用的outgoing的部分。

      参数:
      outgoing - 包含要编码的字节的非空字节数组。
      offset - 要使用的outgoing中的字节的起始位置。
      len - 要使用的outgoing中的字节数。
      返回:
      包含编码字节的非空字节数组。
      抛出:
      SaslException - 如果无法成功包装outgoing
      IllegalStateException - 如果身份验证交换尚未完成,或者协商的保护质量既没有完整性也没有隐私。
    • getNegotiatedProperty

      Object getNegotiatedProperty(String propName)
      检索协商的属性。只有在身份验证交换完成后(即isComplete()返回true时)才能调用此方法;否则将抛出IllegalStateException

      Sasl类包括几个众所周知的属性名称(例如,Sasl.QOP)。SASL提供程序可以支持其他特定于供应商和/或机制的属性。

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

      void dispose() throws SaslException
      处置SaslServer可能正在使用的任何系统资源或安全敏感信息。调用此方法将使SaslServer实例无效。此方法是幂等的。
      抛出:
      SaslException - 处置资源时遇到问题。