Fix: 修复 MongoDB 默认库影响认证库

Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
zipg
2026-06-27 15:14:57 +08:00
committed by GitHub
co-authored by staff
parent 388d59fb4a
commit a8fa8bed5b
3 changed files with 35 additions and 9 deletions
@@ -257,7 +257,7 @@ public final class MongoAgent {
if (authSource != null && !authSource.isBlank()) {
return authSource;
}
return defaultString(stringOrNull(connObj, "database"), "admin");
return "admin";
}
private static String urlParam(String urlParams, String key) {
@@ -135,11 +135,11 @@ class MongoAgentTest {
}
@Test
void fallsBackToDefaultDatabaseWhenAuthSourceIsMissing() {
void fallsBackToAdminWhenAuthSourceIsMissing() {
JsonObject connection = new JsonObject();
connection.addProperty("database", "gray_lite_twin_fat");
assertEquals("gray_lite_twin_fat", MongoAgent.authenticationDatabase(connection));
assertEquals("admin", MongoAgent.authenticationDatabase(connection));
}
// ─── TLS: configureBuilder JSON parsing ───
+32 -6
View File
@@ -1080,7 +1080,7 @@ impl ConnectionConfig {
}
DatabaseType::Databend => normalize_bare_mysql_url_params(value),
DatabaseType::Postgres | DatabaseType::Redshift => normalize_postgres_url_params(value, self.ssl),
DatabaseType::MongoDb => normalize_mongo_url_params(value, self.ssl),
DatabaseType::MongoDb => normalize_mongo_url_params(value, self.ssl, !self.username.trim().is_empty()),
_ => value.trim_start_matches('?').to_string(),
}
}
@@ -1170,7 +1170,7 @@ fn normalize_mysql_url_params(value: &str, force_tls: bool, accept_invalid_certs
parts.join("&")
}
fn normalize_mongo_url_params(value: &str, force_tls: bool) -> String {
fn normalize_mongo_url_params(value: &str, force_tls: bool, default_auth_source: bool) -> String {
let value = value.trim_start_matches('?');
let mut parts: Vec<String> = value.split('&').filter(|part| !part.is_empty()).map(str::to_string).collect();
@@ -1179,6 +1179,10 @@ fn normalize_mongo_url_params(value: &str, force_tls: bool) -> String {
parts.insert(0, "tls=true".to_string());
}
if default_auth_source && !parts.iter().any(|part| url_param_key_is(part, "authSource")) {
parts.push("authSource=admin".to_string());
}
parts.join("&")
}
@@ -2137,10 +2141,32 @@ mod tests {
}
#[test]
fn mongodb_form_url_without_params_does_not_force_topology_or_auth() {
fn mongodb_form_url_without_params_defaults_auth_source_to_admin() {
let config = mongodb_config("root", "secret", Some("admin"));
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin");
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?authSource=admin");
}
#[test]
fn mongodb_form_url_default_database_does_not_change_auth_source() {
let config = mongodb_config("root", "secret", Some("app"));
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/app?authSource=admin");
}
#[test]
fn mongodb_form_url_without_username_does_not_default_auth_source() {
let config = mongodb_config("", "", Some("app"));
assert_eq!(config.connection_url(), "mongodb://10.1.2.3:17000/app");
}
#[test]
fn mongodb_form_url_preserves_explicit_auth_source() {
let mut config = mongodb_config("root", "secret", Some("app"));
config.url_params = Some("authSource=app".to_string());
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/app?authSource=app");
}
#[test]
@@ -2228,8 +2254,8 @@ mod tests {
let mut config = mongodb_config("root", "secret", Some("admin"));
config.ssl = true;
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?tls=true");
assert_eq!(config.redacted_connection_url(), "mongodb://10.1.2.3:17000/admin?tls=true");
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?tls=true&authSource=admin");
assert_eq!(config.redacted_connection_url(), "mongodb://10.1.2.3:17000/admin?tls=true&authSource=admin");
}
#[test]