-
public interface SaslServer
执行SASL身份验证作为服务器。LDAP服务器等服务器获取此类的实例,以执行由特定SASL机制定义的认证。 在
SaslServer
实例上调用方法根据由SaslServer
实现的SASL机制产生挑战。 当认证进行时,该实例封装了SASL服务器的认证交换的状态。以下是LDAP服务器如何使用
SaslServer
。 它首先获得客户端请求的SASL机制的一个SaslServer
的实例: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
-
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 void
dispose()
处理SaslServer可能使用的任何系统资源或安全敏感信息。byte[]
evaluateResponse(byte[] response)
评估响应数据并产生挑战。String
getAuthorizationID()
报告此会话客户端的授权ID。String
getMechanismName()
返回此SASL服务器的IANA注册机制名称。Object
getNegotiatedProperty(String propName)
检索谈判的财产。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注册的机制名称的非空字符串。
-
evaluateResponse
byte[] evaluateResponse(byte[] response) throws SaslException
评估响应数据并产生挑战。 如果在认证过程中从客户端收到响应,则调用此方法来准备适当的下一个挑战以提交给客户端。 如果身份验证成功,并且没有更多的挑战数据要发送给客户端,那么质询将为空。 如果认证必须通过向客户端发送质询,或验证成功但需要由客户端处理的数据进行验证,则该值为非空值。isComplete()
应该每次调用之后调用evaluateResponse()
,以确定是否从所述客户端所需要的任何进一步的反应。- 参数
-
response
- 客户端发送的非空(但可能为空)响应。 - 结果
- 发送给客户端可能是空的挑战。 如果认证成功,并且没有更多的挑战数据要发送给客户端,则为null。
- 异常
-
SaslException
- 如果在处理响应或产生挑战时发生错误。
-
isComplete
boolean isComplete()
确定认证交换是否已完成。 通常在每次调用evaluateResponse()
后调用此方法,以确定认证是否已成功完成或应继续执行。- 结果
- 如果认证交换完成,则为真; 否则为假。
-
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缓冲区的内容,没有表示长度的前四个八位字节字段。offset
和len
指定要使用的部分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缓冲区的内容,而不包含表示长度的前导四个八位字节字段。
offset
和len
指定要使用的部分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
- 处理资源时遇到问题。
-
-