SaslServer (Java SE 11 & JDK 11 ) (original) (raw)
public interface SaslServer
Performs SASL authentication as a server.
A server such an LDAP server gets an instance of this class in order to perform authentication defined by a specific SASL mechanism. Invoking methods on the SaslServer
instance generates challenges according to the SASL mechanism implemented by the SaslServer
. As the authentication proceeds, the instance encapsulates the state of a SASL server's authentication exchange.
Here's an example of how an LDAP server might use a SaslServer
. It first gets an instance of a SaslServer
for the SASL mechanism requested by the client:
SaslServer ss = Sasl.createSaslServer(mechanism,
"ldap", myFQDN, props, callbackHandler);
It can then proceed to use the server for authentication. For example, suppose the LDAP server received an LDAP BIND request containing the name of the SASL mechanism and an (optional) initial response. It then might use the server as follows: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); } }
Since:
1.5
See Also:
Sasl, SaslServerFactory
Method Summary
All Methods Instance Methods Abstract Methods
Modifier and Type Method Description void dispose() Disposes of any system resources or security-sensitive information the SaslServer might be using. byte[] evaluateResponse(byte[] response) Evaluates the response data and generates a challenge. String getAuthorizationID() Reports the authorization ID in effect for the client of this session. String getMechanismName() Returns the IANA-registered mechanism name of this SASL server. Object getNegotiatedProperty(String propName) Retrieves the negotiated property. boolean isComplete() Determines whether the authentication exchange has completed. byte[] unwrap(byte[] incoming, int offset, int len) Unwraps a byte array received from the client. byte[] wrap(byte[] outgoing, int offset, int len) Wraps a byte array to be sent to the client. Method Detail
* #### getMechanismName [String](../../../../java.base/java/lang/String.html "class in java.lang") getMechanismName() Returns the IANA-registered mechanism name of this SASL server. (e.g. "CRAM-MD5", "GSSAPI"). Returns: A non-null string representing the IANA-registered mechanism name. * #### evaluateResponse byte[] evaluateResponse(byte[] response) throws [SaslException](SaslException.html "class in javax.security.sasl") Evaluates the response data and generates a challenge. If a response is received from the client during the authentication process, this method is called to prepare an appropriate next challenge to submit to the client. The challenge is null if the authentication has succeeded and no more challenge data is to be sent to the client. It is non-null if the authentication must be continued by sending a challenge to the client, or if the authentication has succeeded but challenge data needs to be processed by the client.`isComplete()` should be called after each call to `evaluateResponse()`,to determine if any further response is needed from the client. Parameters: `response` \- The non-null (but possibly empty) response sent by the client. Returns: The possibly null challenge to send to the client. It is null if the authentication has succeeded and there is no more challenge data to be sent to the client. Throws: `[SaslException](SaslException.html "class in javax.security.sasl")` \- If an error occurred while processing the response or generating a challenge. * #### isComplete boolean isComplete() Determines whether the authentication exchange has completed. This method is typically called after each invocation of`evaluateResponse()` to determine whether the authentication has completed successfully or should be continued. Returns: true if the authentication exchange has completed; false otherwise. * #### getAuthorizationID [String](../../../../java.base/java/lang/String.html "class in java.lang") getAuthorizationID() Reports the authorization ID in effect for the client of this session. This method can only be called if isComplete() returns true. Returns: The authorization ID of the client. Throws: `[IllegalStateException](../../../../java.base/java/lang/IllegalStateException.html "class in java.lang")` \- if this authentication session has not completed * #### unwrap byte[] unwrap(byte[] incoming, int offset, int len) throws [SaslException](SaslException.html "class in javax.security.sasl") Unwraps a byte array received from the client. This method can be called only after the authentication exchange has completed (i.e., when `isComplete()` returns true) and only if the authentication exchange has negotiated integrity and/or privacy as the quality of protection; otherwise, an `IllegalStateException` is thrown. `incoming` is the contents of the SASL buffer as defined in RFC 2222 without the leading four octet field that represents the length.`offset` and `len` specify the portion of `incoming` to use. Parameters: `incoming` \- A non-null byte array containing the encoded bytes from the client. `offset` \- The starting position at `incoming` of the bytes to use. `len` \- The number of bytes from `incoming` to use. Returns: A non-null byte array containing the decoded bytes. Throws: `[SaslException](SaslException.html "class in javax.security.sasl")` \- if `incoming` cannot be successfully unwrapped. `[IllegalStateException](../../../../java.base/java/lang/IllegalStateException.html "class in java.lang")` \- if the authentication exchange has not completed, or if the negotiated quality of protection has neither integrity nor privacy * #### wrap byte[] wrap(byte[] outgoing, int offset, int len) throws [SaslException](SaslException.html "class in javax.security.sasl") Wraps a byte array to be sent to the client. This method can be called only after the authentication exchange has completed (i.e., when `isComplete()` returns true) and only if the authentication exchange has negotiated integrity and/or privacy as the quality of protection; otherwise, a `SaslException` is thrown. The result of this method will make up the contents of the SASL buffer as defined in RFC 2222 without the leading four octet field that represents the length.`offset` and `len` specify the portion of `outgoing` to use. Parameters: `outgoing` \- A non-null byte array containing the bytes to encode. `offset` \- The starting position at `outgoing` of the bytes to use. `len` \- The number of bytes from `outgoing` to use. Returns: A non-null byte array containing the encoded bytes. Throws: `[SaslException](SaslException.html "class in javax.security.sasl")` \- if `outgoing` cannot be successfully wrapped. `[IllegalStateException](../../../../java.base/java/lang/IllegalStateException.html "class in java.lang")` \- if the authentication exchange has not completed, or if the negotiated quality of protection has neither integrity nor privacy. * #### getNegotiatedProperty [Object](../../../../java.base/java/lang/Object.html "class in java.lang") getNegotiatedProperty([String](../../../../java.base/java/lang/String.html "class in java.lang") propName) Retrieves the negotiated property. This method can be called only after the authentication exchange has completed (i.e., when `isComplete()` returns true); otherwise, an`IllegalStateException` is thrown. The [Sasl](Sasl.html "class in javax.security.sasl") class includes several well-known property names (For example, [Sasl.QOP](Sasl.html#QOP)). A SASL provider can support other properties which are specific to the vendor and/or a mechanism. Parameters: `propName` \- the property Returns: The value of the negotiated property. If null, the property was not negotiated or is not applicable to this mechanism. Throws: `[IllegalStateException](../../../../java.base/java/lang/IllegalStateException.html "class in java.lang")` \- if this authentication exchange has not completed * #### dispose void dispose() throws [SaslException](SaslException.html "class in javax.security.sasl") Disposes of any system resources or security-sensitive information the SaslServer might be using. Invoking this method invalidates the SaslServer instance. This method is idempotent. Throws: `[SaslException](SaslException.html "class in javax.security.sasl")` \- If a problem was encountered while disposing the resources.
Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2025, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.