JavaTM 2 Platform
Standard Ed. 6

javax.security.sasl
介面 SaslServer


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()
          報告此Session客戶端的有效授權 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()
報告此Session客戶端的有效授權 ID。僅在 isComplete() 返回 true 時才可調用此方法。

返回:
客戶端的授權 ID。
拋出:
IllegalStateException - 如果未完成此次驗證Session

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 - 如果釋放資源時遇到問題。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only