-
public interface SaslServer
执行SASL身份验证作为服务器。服务器(例如LDAP服务器)获取此类的实例,以便执行由特定SASL机制定义的身份验证。 根据
SaslServer
实施的SASL机制,在SaslServer
实例上调用方法会产生挑战。 随着身份验证的进行,实例会封装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
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 void
dispose()
处置SaslServer可能正在使用的任何系统资源或安全敏感信息。byte[]
evaluateResponse(byte[] response)
评估响应数据并生成挑战。String
getAuthorizationID()
报告对此会话的客户端有效的授权标识。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
评估响应数据并生成挑战。 如果在认证过程中从客户端收到响应,则调用此方法以准备适当的下一个挑战以提交给客户端。 如果身份验证成功并且不再将质询数据发送到客户端,则质询为空。 如果必须通过向客户端发送质询来继续身份验证,或者身份验证成功但需要由客户端处理质询数据,则它为非null。isComplete()
应该每次调用之后调用evaluateResponse()
,以确定是否从所述客户端所需要的任何进一步的反应。- 参数
-
response
- 客户端发送的非空(但可能为空)响应。 - 结果
- 发送给客户端的可能为空的挑战。 如果身份验证成功并且没有更多挑战数据要发送到客户端,则为null。
- 异常
-
SaslException
- 如果在处理响应或生成质询时发生错误。
-
isComplete
boolean isComplete()
确定身份验证交换是否已完成。 通常在每次调用evaluateResponse()
之后调用此方法,以确定身份验证是成功完成还是应继续。- 结果
- 如果身份验证交换已完成,则为true; 否则是假的。
-
getAuthorizationID
String getAuthorizationID()
报告对此会话的客户端有效的授权标识。 只有isComplete()返回true时才能调用此方法。- 结果
- 客户端的授权标识。
- 异常
-
IllegalStateException
- 如果此验证会话尚未完成
-
unwrap
byte[] unwrap(byte[] incoming, int offset, int len) throws SaslException
展开从客户端接收的字节数组。 只有在身份验证交换完成后(即,当isComplete()
返回true时)才能调用此方法,并且只有在身份验证交换已协商完整性和/或隐私作为保护质量的情况下才能调用此方法; 否则,抛出IllegalStateException
。incoming
是RFC 2222中定义的SASL缓冲区的内容,没有表示长度的前导四个八位字节字段。offset
和len
指定要使用的部分incoming
。- 参数
-
incoming
- 包含来自客户端的编码字节的非null字节数组。 -
offset
- 要使用的字节的起始位置incoming
。 -
len
- 要使用的字节数incoming
。 - 结果
- 包含解码字节的非空字节数组。
- 异常
-
SaslException
- 如果incoming
无法成功解包。 -
IllegalStateException
- 如果验证交换尚未完成,或者协商的保护质量既不完整也不隐私
-
wrap
byte[] wrap(byte[] outgoing, int offset, int len) throws SaslException
包装要发送到客户端的字节数组。 只有在认证交换完成后(即isComplete()
返回true时)才能调用此方法,并且只有在认证交换协议已将协议完整性和/或隐私作为保护质量时isComplete()
; 否则,抛出SaslException
。此方法的结果将构成RFC 2222中定义的SASL缓冲区的内容,而不包含表示长度的前导四个八位字节字段。
offset
和len
指定要使用的部分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,则不会协商该属性或不适用于此机制。
- 异常
-
IllegalStateException
- 如果此验证交换尚未完成
-
dispose
void dispose() throws SaslException
处置SaslServer可能正在使用的任何系统资源或安全敏感信息。 调用此方法会使SaslServer实例无效。 这种方法是幂等的。- 异常
-
SaslException
- 如果在处置资源时遇到问题。
-
-