2020import javax .security .sasl .Sasl ;
2121import javax .security .sasl .SaslClient ;
2222import javax .security .sasl .SaslException ;
23- import java .util .Map ;
23+ import java .util .Arrays ;
24+ import java .util .HashSet ;
25+ import java .util .List ;
26+ import java .util .Set ;
2427
2528/**
2629 * Default implementation of SaslConfig that uses the standard Java
2730 * algorithm for selecting a sasl client.
2831 * @see com.rabbitmq.client.ConnectionFactory
2932 */
3033public class DefaultSaslConfig implements SaslConfig {
34+ public static final String [] DEFAULT_PREFERRED_MECHANISMS = new String []{"PLAIN" };
35+
3136 private ConnectionFactory factory ;
3237 private String authorizationId ;
33- private Map < String ,?> mechanismProperties ;
38+ private String [] preferredMechanisms = DEFAULT_PREFERRED_MECHANISMS ;
3439 private CallbackHandler callbackHandler ;
3540
3641 public DefaultSaslConfig (ConnectionFactory factory ) {
@@ -42,16 +47,28 @@ public void setAuthorizationId(String authorizationId) {
4247 this .authorizationId = authorizationId ;
4348 }
4449
45- public void setMechanismProperties (Map <String , ?> mechanismProperties ) {
46- this .mechanismProperties = mechanismProperties ;
50+ /**
51+ * Set a list of SASL mechanisms to use (in descending order of preference)
52+ * @param preferredMechanisms
53+ */
54+ public void setPreferredMechanisms (String [] preferredMechanisms ) {
55+ this .preferredMechanisms = preferredMechanisms ;
4756 }
4857
4958 public void setCallbackHandler (CallbackHandler callbackHandler ) {
5059 this .callbackHandler = callbackHandler ;
5160 }
5261
53- public SaslClient getSaslClient (String [] mechanisms ) throws SaslException {
54- return Sasl .createSaslClient (mechanisms , authorizationId , "AMQP" ,
55- factory .getHost (), mechanismProperties , callbackHandler );
62+ public SaslClient getSaslClient (String [] serverMechanisms ) throws SaslException {
63+ List <String > server = Arrays .asList (serverMechanisms );
64+ List <String > client = Arrays .asList (preferredMechanisms );
65+ client .retainAll (server );
66+
67+ for (String mechanism : client ) {
68+ SaslClient saslClient = Sasl .createSaslClient (new String []{mechanism },
69+ authorizationId , "AMQP" , factory .getHost (), null , callbackHandler );
70+ if (saslClient != null ) return saslClient ;
71+ }
72+ return null ;
5673 }
5774}
0 commit comments