|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
javax.security.sasl
接口 SaslServer
-
public interface SaslServer
以服务器的身份执行 SASL 身份验证。
为了执行具体 SASL 机制所定义的身份验证,服务器(例如 LDAP 服务器)要获得此类的一个实例。调用 SaslServer 实例上的方法可生成与 SaslServer 所实现的 SASL 机制相对应的 challenge。随着身份验证的进行,该实例会封装 SASL 服务器的身份验证交换状态。
以下是 LDAP 服务器如何使用 SaslServer 的一个示例。它首先为客户端请求的 SASL 机制获得一个 SaslServer 实例:
然后可继续为身份验证使用该服务器。例如,假设 LDAP 服务器接收到一个 LDAP BIND 请求,其中包含 SASL 机制的名称和(可选的)初始响应。然后它可按如下方式使用服务器:SaslServer ss = Sasl.createSaslServer(mechanism, "ldap", myFQDN, props, callbackHandler);
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 个八位组字段。offset 和 len 指定了要使用的 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 个八位组字段。offset 和 len 指定了要使用的 outgoing 部分。
-
- 参数:
-
outgoing
- 非 null 的 byte 数组,包含要编码的字节。 -
offset
- 所用字节在 outgoing 中的开始位置。 -
len
- 使用 outgoing 中的字节数。 - 返回:
- 包含已编码字节的非 null byte 数组。
- 抛出:
-
SaslException
- 如果无法成功包装 outgoing。 -
IllegalStateException
- 如果身份验证交换未完成,如果协商的保护性质既没有完整性,也没有机密性。
getNegotiatedProperty
Object getNegotiatedProperty(String propName)
- 检索已协商的属性。仅在身份验证交换已完成后(即当 isComplete() 返回 true)才调用此方法;否则会抛出 IllegalStateException。
-
- 参数:
-
propName
- 属性 - 返回:
- 已协商属性的值。如果为 null,则未协商该属性,或者该属性不适用于此机制。
- 抛出:
-
IllegalStateException
- 如果未完成此身份验证交换