簡體   English   中英

如何配置帶有身份驗證的嵌入式MongoDB,以用於Spring Boot集成測試?

[英]How do I configure embedded MongoDB with authentication for use in spring boot integration tests?

我有一個使用MongoDB進行持久化的Spring Boot應用程序。 我正在進行集成測試,並且正在為嵌入式DB使用flappoodle嵌入式mongo庫。

這與彈簧靴的自動配置結合在一起,對於集成測試而言,一切工作都非常出色。 但是,一旦我添加了MongoDB的身份驗證憑據,一切都會崩潰。

我的理解是,spring自動配置會找到憑據並嘗試通過身份驗證連接到數據庫,但失敗了,因為它是一個尚未使用憑據初始化的嵌入式數據庫。

我嘗試使用mongeez來在春季啟動前初始化憑據,但是該庫在憑據感知方面存在相同的問題。

所以我真正的問題是:

有沒有辦法通過身份驗證來初始化嵌入式數據庫? 我一直在研究源代碼,但沒有發現任何東西。

我遇到過同樣的問題。 這是對我有效的方式(使用Kotlin):

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = ["spring.data.mongodb.port="])
class IntegrationTests {

@Autowired
private val webClient: WebTestClient? = null

@Autowired
private val mongoConfig: IMongodConfig? = null
var collection: MongoCollection<Document>? = null

fun createDBAndCollection(collectionName: String){
    val mongo = MongoClient("127.0.0.1", mongoConfig!!.net().port)
    val db = mongo.getDatabase("local")
    db.createCollection(collectionName)
    collection = db.getCollection(collectionName)
}

@Test
fun `Find all tracks on JSON REST endpoint`() {
    createDBAndCollection("track")
    collection?.insertOne(Document("key", "val"))

    webClient!!.get().uri("/reactive/tracks")
            .accept(APPLICATION_JSON)
            .exchange()
            .expectStatus().is2xxSuccessful
            .expectBodyList<Track>()
            .hasSize(1);
}
}
  • 無需更改application.properties。 它足以使用SprintBootTest Annotation清空端口設置(其他方法對我不起作用,例如@TestPropertySource)
  • mongoConfig被注入並用於檢索由flappoodle生成的隨機端口
  • 數據庫名稱必須與application.properties中的名稱匹配(不過我敢肯定有一種方法可以在運行時動態讀取它)。

我的gradle測試依賴項是:

testImplementation('de.flapdoodle.embed:de.flapdoodle.embed.mongo')
testImplementation('io.projectreactor:reactor-test')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")

實際上,您可以通過查看admin.system.users集合來創建經過身份驗證的用戶。 只需創建一個測試用戶並將其與mongo客戶端放在一起即可。 一旦有了用戶,您就可以轉儲該文檔,並使用該json在嵌入式mongo測試套件中創建經過身份驗證的新用戶。 就像這樣:

private static void createAuthorizationUser() {
    MongoClient mongoClient = new MongoClient(HOST);
    MongoDatabase admin = mongoClient.getDatabase("admin");
    MongoCollection<Document> usersCollection = admin.getCollection("system.users");
    usersCollection.insertOne(Document.parse(""
            + "{\n" + 
            "    \"_id\": \"admin.test-user\",\n" + 
            //"    \"userId\": Binary(\"rT2Ig**********jGXZEQ==\", 4),\n" + 
            "    \"user\": \"test-user\",\n" + 
            "    \"db\": \"admin\",\n" + 
            "    \"credentials\": {\n" + 
            "        \"SCRAM-SHA-1\": {\n" + 
            "            \"iterationCount\": 10000,\n" + 
            "            \"salt\": \"gmm******GnNcAw==\",\n" + 
            "            \"storedKey\": \"qE***********8/LAvG7s=\",\n" + 
            "            \"serverKey\": \"Re*********eQh6w=\"\n" + 
            "        }\n" + 
            "    },\n" + 
            "    \"roles\": [\n" + 
            "        {\n" + 
            "            \"role\": \"readWrite\",\n" + 
            "            \"db\": \"test\"\n" + 
            "        }\n" + 
            "    ]\n" + 
            "}"
            + ""));
}

我創建了一個名為test-user的用戶,該用戶對test db具有readWrite特權。 出於某種原因,嵌入式Mongo不喜歡Binary函數,而只是對其進行注釋不會損害身份驗證功能。

創建客戶時,您可以簡單地通過

MongoClient mongoClient = new MongoClient(
    new MongoClientURI( 
        String.format("mongodb://%s:%s@%s:%d/%s", "test-user", "****", "localhost", 27017, "admin" ) 
    )
);

它應該解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM