<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    Spring Boot Data Mongodb Starter自動配置那些坑

    正好做Mongodb主從復制嘗試使用Spring Boot Data Mongodb Starter插件鏈接訪問Mongodb數據庫集群。

    遇到的坑:

    • spring.data.mongodb.host和spring.data.mongodb.port形式不適合集群配置,會報host無法識別異常
    • spring.data.mongodb.uri中經常拋出authentication failed異常


    解決辦法:

    1.  對于第一個坑,請使用spring.data.mongodb.uri。如果使用了uri,則其余的host/username/password/db/auth-db這些全部無效。
    2.  對于第二個坑,請在spring.data.mongodb.uri中指定replicaSet和authsource,另外記得把所有集群節點服務器地址都列全。
      如果auth-db和db是同一個,則無需加authsource,如果不同,則加authsource=admin


    我沒有把authsource指定,所以一直報authentication failed異常。然后只好一點點去發掘問題點,最后查到在com.mongodb.ConnectionString類中的createCredentials中

    private MongoCredential createCredentials(final Map<String, List<String>> optionsMap, final String userName,
                                                  final char[] password) {
            AuthenticationMechanism mechanism = null;
            String authSource = (database == null) ? "admin" : database;
            String gssapiServiceName = null;
            String authMechanismProperties = null;

            for (final String key : AUTH_KEYS) {
                String value = getLastValue(optionsMap, key);

                if (value == null) {
                    continue;
                }

                if (key.equals("authmechanism")) {
                    mechanism = AuthenticationMechanism.fromMechanismName(value);
                } else if (key.equals("authsource")) {
                    authSource = value;
                } else if (key.equals("gssapiservicename")) {
                    gssapiServiceName = value;
                } else if (key.equals("authmechanismproperties")) {
                    authMechanismProperties = value;
                }
            }


            MongoCredential credential = null;
            if (mechanism != null) {
                switch (mechanism) {
                    case GSSAPI:
                        credential = MongoCredential.createGSSAPICredential(userName);
                        if (gssapiServiceName != null) {
                            credential = credential.withMechanismProperty("SERVICE_NAME", gssapiServiceName);
                        }
                        break;
                    case PLAIN:
                        credential = MongoCredential.createPlainCredential(userName, authSource, password);
                        break;
                    case MONGODB_CR:
                        credential = MongoCredential.createMongoCRCredential(userName, authSource, password);
                        break;
                    case MONGODB_X509:
                        credential = MongoCredential.createMongoX509Credential(userName);
                        break;
                    case SCRAM_SHA_1:
                        credential = MongoCredential.createScramSha1Credential(userName, authSource, password);
                        break;
                    default:
                        throw new UnsupportedOperationException(format("The connection string contains an invalid authentication mechanism'. "
                                                                               + "'%s' is not a supported authentication mechanism",
                                mechanism));
                }
            } else if (userName != null) {
                credential = MongoCredential.createCredential(userName, authSource, password);
            }

            if (credential != null && authMechanismProperties != null) {
                for (String part : authMechanismProperties.split(",")) {
                    String[] mechanismPropertyKeyValue = part.split(":");
                    if (mechanismPropertyKeyValue.length != 2) {
                        throw new IllegalArgumentException(format("The connection string contains invalid authentication properties. "
                                + "'%s' is not a key value pair", part));
                    }
                    String key = mechanismPropertyKeyValue[0].trim().toLowerCase();
                    String value = mechanismPropertyKeyValue[1].trim();
                    if (key.equals("canonicalize_host_name")) {
                        credential = credential.withMechanismProperty(key, Boolean.valueOf(value));
                    } else {
                        credential = credential.withMechanismProperty(key, value);
                    }
                }
            }
            return credential;
        }


    authSource默認會指向我們目標數據的數據庫。然而在身份驗證機制中我們通常需要指向admin。(非常想報粗口,代碼作者在這里腦袋被men擠了么)。所以需要強制指定authSource中指定。具體指定方式如下:

     

     

     

     

    mongodb://{用戶名}:{密碼}@{host1}:27017,{host2}:27017,{host3}:27017/{目標數據庫}?replicaSet={復制集名稱}&write=1&readPreference=primary&authsource={授權數據庫}

    posted on 2020-03-17 09:39 paulwong 閱讀(1962) 評論(0)  編輯  收藏 所屬分類: MONGODBSPRING BOOT

    主站蜘蛛池模板: 亚洲精品无码AV人在线播放 | 日韩在线免费播放| 无码免费又爽又高潮喷水的视频| 日本亚洲国产一区二区三区| 免费无码毛片一区二区APP| 亚洲深深色噜噜狠狠网站| 亚洲国产成人久久综合一区77| 今天免费中文字幕视频| 中文字幕亚洲精品无码| 国产精品亚洲w码日韩中文| 亚洲免费一级视频| 免费一区二区无码视频在线播放 | 视频一区二区三区免费观看| 亚洲av日韩av不卡在线观看| 成人免费无遮挡无码黄漫视频| 久久久WWW成人免费精品| 亚洲午夜无码久久久久小说 | 两个人看的www免费高清| 亚洲AV男人的天堂在线观看| 亚洲人成人一区二区三区| 成年丰满熟妇午夜免费视频| 国产成年无码久久久免费| 亚洲精品无码mⅴ在线观看 | 精品久久久久久亚洲综合网| 久久精品国产亚洲av成人| 国产成人精品高清免费| 特级无码毛片免费视频尤物| 久久久亚洲精华液精华液精华液| 亚洲色图在线观看| 亚洲午夜爱爱香蕉片| 全免费A级毛片免费看网站| 无码少妇精品一区二区免费动态 | 麻豆最新国产剧情AV原创免费 | 91黑丝国产线观看免费| 国产精品一区二区三区免费| 亚洲精品久久无码| 亚洲最大中文字幕| 亚洲精品免费观看| 久久亚洲中文字幕精品一区| 国产美女被遭强高潮免费网站| 国产精品怡红院永久免费|