软件包  javax.security.sasl

Interface SaslClient


  • public interface SaslClient
    作为客户端执行SASL身份验证。

    用于LDAP的协议库获取此类的实例,以便执行由特定SASL机制定义的身份验证。 调用的方法SaslClient实例进程的挑战,根据实现的SASL机制创建响应SaslClient 随着身份验证的进行,实例会封装SASL客户端的身份验证交换。

    以下是LDAP库如何使用SaslClient 它首先得到一个SaslClient的实例:

    
     SaslClient sc = Sasl.createSaslClient(mechanisms,
         authorizationId, protocol, serverName, props, callbackHandler);
    
    然后,它可以继续使用客户端进行身份验证。 例如,LDAP库可能使用客户端,如下所示:
    
     // 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
    另请参见:
    SaslSaslClientFactory
    • 方法摘要

      所有方法  实例方法 抽象方法 
      变量和类型 方法 描述
      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)
      包装要发送到服务器的字节数组。
    • 方法详细信息

      • getMechanismName

        String getMechanismName()
        返回此SASL客户端的IANA注册机制名称。 (例如“CRAM-MD5”,“GSSAPI”)。
        结果
        表示IANA注册的机制名称的非空字符串。
      • hasInitialResponse

        boolean hasInitialResponse()
        确定此机制是否具有可选的初始响应。 如果为true,则调用者应使用空数组调用evaluateChallenge()以获取初始响应。
        结果
        如果此机制具有初始响应,则为true。
      • evaluateChallenge

        byte[] evaluateChallenge​(byte[] challenge)
                          throws SaslException
        评估挑战数据并生成响应。 如果在身份验证过程中收到来自服务器的质询,则调用此方法以准备适当的下一个响应以提交给服务器。
        参数
        challenge - 从服务器发送的非空质询。 挑战阵列可以具有零长度。
        结果
        发送到服务器的可能为null的响应。 如果挑战伴随“SUCCESS”状态并且挑战仅包含客户端更新其状态的数据并且不需要将响应发送到服务器,则它为空。 如果客户端要发送没有数据的响应,则响应是零长度字节数组。
        异常
        SaslException - 如果在处理质询或生成响应时发生错误。
      • isComplete

        boolean isComplete()
        确定身份验证交换是否已完成。 可以在任何时间调用此方法,但通常,在调用者已经从服务器(以协议特定方式)接收到交换已完成的指示之前,不会调用该方法。
        结果
        如果身份验证交换已完成,则为true; 否则是假的。
      • unwrap

        byte[] unwrap​(byte[] incoming,
                      int offset,
                      int len)
               throws SaslException
        展开从服务器接收的字节数组。 只有在认证交换完成后才会调用此方法(即,当isComplete()返回true时)并且仅当认证交换已将完整性和/或隐私协商为保护质量时才能调用此方法; 否则,抛出IllegalStateException

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

        参数
        incoming - 包含来自服务器的编码字节的非null字节数组。
        offset - 要使用的字节的起始位置 incoming
        len - 要使用的字节数 incoming
        结果
        包含解码字节的非空字节数组。
        异常
        SaslException - 如果 incoming无法成功解包。
        IllegalStateException - 如果认证交换尚未完成,或者协商的保护质量既没有完整性也没有隐私。
      • wrap

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

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

        参数
        outgoing - 包含要编码的字节的非null字节数组。
        offset - 要使用的字节的起始位置 outgoing
        len - 要使用的 outgoing的字节数。
        结果
        包含编码字节的非null字节数组。
        异常
        SaslException - 如果 outgoing无法成功包装。
        IllegalStateException - 如果验证交换尚未完成,或者协商的保护质量既不完整也不隐私。
      • getNegotiatedProperty

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

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

        参数
        propName - 非null属性名称。
        结果
        谈判财产的价值。 如果为null,则不会协商该属性或不适用于此机制。
        异常
        IllegalStateException - 如果此身份验证交换尚未完成
      • dispose

        void dispose()
              throws SaslException
        处置SaslClient可能正在使用的任何系统资源或安全敏感信息。 调用此方法会使SaslClient实例无效。 这种方法是幂等的。
        异常
        SaslException - 如果在处置资源时遇到问题。