|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
public interface SaslClient
以客戶端的身份執行 SASL 驗證。
為了執行具體 SASL 機制所定義的驗證,協議資源庫(例如用於 LDAP 的資源庫)要獲得此類別的一個實例。調用 SaslClient 實例的方法可處理 challenge,並創建與 SaslClient 所實作的 SASL 機制相對應的回應。隨著驗證的進行,該實例會封裝 SASL 客戶端的驗證交換狀態。
以下是 LDAP 資源庫如何使用 SaslClient 的一個範例。它首先獲得 SaslClient 的一個實例:
然後它可繼續使用該客戶端進行驗證。例如,LDAP 資源庫可能按如下方式使用該客戶端:SaslClient sc = Sasl.createSaslClient(mechanisms, authorizationId, protocol, serverName, props, callbackHandler);
如果該機制有初始回應,則資源庫可調用帶有空 challenge 的 evaluateChallenge() 來獲得該初始回應。諸如 IMAP4 等此類別協議在其送往伺服器的第一個驗證命令中不包括初始回應,所以可無需首先調用 hasInitialResponse() 或 evaluateChallenge() 即可發起驗證。當伺服器回應該命令時,它會發送初始 challenge。對於客戶端首先發送資料的 SASL 機制而言,伺服器應該發出一個沒有資料的 challenge。然後,這會導致帶有空 challenge 的 evaluateChallenge() 調用(在客戶端上)。// 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); } }
Sasl
,
SaslClientFactory
方法摘要 | |
---|---|
void |
dispose()
處置 SaslClient 可能使用的所有系統資源或安全敏感資訊。 |
byte[] |
evaluateChallenge(byte[] challenge)
評估 challenge 資料並產生一個回應。 |
String |
getMechanismName()
返回此 SASL 客戶端的 IANA 註冊機制名。 |
Object |
getNegotiatedProperty(String propName)
獲取已協商的屬性。 |
boolean |
hasInitialResponse()
確定此機制是否具有可選的初始回應。 |
boolean |
isComplete()
確定驗證交換是否已完成。 |
byte[] |
unwrap(byte[] incoming,
int offset,
int len)
解包接收自伺服器的 byte 陣列。 |
byte[] |
wrap(byte[] outgoing,
int offset,
int len)
包裹要發送到伺服器的 byte 陣列。 |
方法詳細資訊 |
---|
String getMechanismName()
boolean hasInitialResponse()
byte[] evaluateChallenge(byte[] challenge) throws SaslException
challenge
- 伺服器發送的非 null challenge。該 challenge 陣列的長度可以為零。
SaslException
- 如果處理 challenge 或產生回應時發生錯誤。boolean isComplete()
byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException
incoming 是 SASL 緩衝區的內容(在 RFC 2222 中定義),沒有表示長度的前導 4 個八位組欄位。offset 和 len 指定了要使用的 incoming 部分。
incoming
- 非 null 的 byte 陣列,包含取自伺服器的已編碼位元組。offset
- 所用位元組在 incoming 中的開始位置。len
- 要使用的 incoming 中的位元組數。
SaslException
- 如果無法成功解包 incoming。
IllegalStateException
- 如果驗證交換未完成,如果協商的保護級別既沒有完整性,也沒有機密性。byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException
此方法的結果會組成 SASL 緩衝區的內容(在 RFC 2222 中定義),沒有表示長度的前導 4 個八位組欄位。offset 和 len 指定了要使用的 outgoing 部分。
outgoing
- 非 null 的 byte 陣列,包含要編碼的位元組。offset
- 所用位元組在 outgoing 中的開始位置。len
- 要使用的 outgoing 中的位元組數。
SaslException
- 如果無法成功包裹 outgoing。
IllegalStateException
- 如果驗證交換未完成,如果協商的保護級別既沒有完整性,也沒有機密性。Object getNegotiatedProperty(String propName)
propName
- 非 null 的屬性名。
IllegalStateException
- 如果未完成此驗證交換。void dispose() throws SaslException
SaslException
- 如果釋放資源時遇到問題。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。