66import static com .mongodb .AuthenticationMechanism .PLAIN ;
77import static com .mongodb .AuthenticationMechanism .SCRAM_SHA_1 ;
88import static com .mongodb .AuthenticationMechanism .SCRAM_SHA_256 ;
9+ import static io .quarkus .credentials .CredentialsProvider .PASSWORD_PROPERTY_NAME ;
10+ import static io .quarkus .credentials .CredentialsProvider .USER_PROPERTY_NAME ;
911import static org .bson .codecs .configuration .CodecRegistries .fromProviders ;
1012import static org .bson .codecs .configuration .CodecRegistries .fromRegistries ;
1113
5658
5759import io .quarkus .arc .Arc ;
5860import io .quarkus .arc .InstanceHandle ;
61+ import io .quarkus .credentials .CredentialsProvider ;
62+ import io .quarkus .credentials .runtime .CredentialsProviderFinder ;
5963import io .quarkus .mongodb .health .MongoHealthCheck ;
6064import io .quarkus .mongodb .impl .ReactiveMongoClientImpl ;
6165import io .quarkus .mongodb .reactive .ReactiveMongoClient ;
@@ -381,12 +385,11 @@ public ServerAddress apply(String address) {
381385 }
382386
383387 private MongoCredential createMongoCredential (MongoClientConfig config ) {
384- String username = config .credentials . username . orElse ( null );
385- if (username == null ) {
388+ UsernamePassword usernamePassword = determineUserNamePassword ( config .credentials );
389+ if (usernamePassword == null ) {
386390 return null ;
387391 }
388392
389- char [] password = config .credentials .password .map (String ::toCharArray ).orElse (null );
390393 // get the authsource, or the database from the config, or 'admin' as it is the default auth source in mongo
391394 // and null is not allowed
392395 String authSource = config .credentials .authSource .orElse (config .database .orElse ("admin" ));
@@ -398,6 +401,8 @@ private MongoCredential createMongoCredential(MongoClientConfig config) {
398401 }
399402
400403 // Create the MongoCredential instance.
404+ String username = usernamePassword .getUsername ();
405+ char [] password = usernamePassword .getPassword ();
401406 MongoCredential credential ;
402407 if (mechanism == GSSAPI ) {
403408 credential = MongoCredential .createGSSAPICredential (username );
@@ -427,6 +432,25 @@ private MongoCredential createMongoCredential(MongoClientConfig config) {
427432 return credential ;
428433 }
429434
435+ private UsernamePassword determineUserNamePassword (CredentialConfig config ) {
436+ if (config .credentialsProvider .isPresent ()) {
437+ String beanName = config .credentialsProviderName .orElse (null );
438+ CredentialsProvider credentialsProvider = CredentialsProviderFinder .find (beanName );
439+ String name = config .credentialsProvider .get ();
440+ Map <String , String > credentials = credentialsProvider .getCredentials (name );
441+ String user = credentials .get (USER_PROPERTY_NAME );
442+ String password = credentials .get (PASSWORD_PROPERTY_NAME );
443+ return new UsernamePassword (user , password .toCharArray ());
444+ } else {
445+ String username = config .username .orElse (null );
446+ if (username == null ) {
447+ return null ;
448+ }
449+ char [] password = config .password .map (String ::toCharArray ).orElse (null );
450+ return new UsernamePassword (username , password );
451+ }
452+ }
453+
430454 private AuthenticationMechanism getAuthenticationMechanism (String authMechanism ) {
431455 AuthenticationMechanism mechanism ;
432456 try {
@@ -450,4 +474,22 @@ public void stop() {
450474 }
451475 }
452476 }
477+
478+ private static class UsernamePassword {
479+ private final String username ;
480+ private final char [] password ;
481+
482+ public UsernamePassword (String username , char [] password ) {
483+ this .username = username ;
484+ this .password = password ;
485+ }
486+
487+ public String getUsername () {
488+ return username ;
489+ }
490+
491+ public char [] getPassword () {
492+ return password ;
493+ }
494+ }
453495}
0 commit comments