【问题标题】:Couchbase 5 bucket password settingCouchbase 5 存储桶密码设置
【发布时间】:2017-10-28 22:10:35
【问题描述】:

我正在尝试编写一个示例来学习 couchbase。我正在尝试将它与 spring boot 一起使用,它是 crud 存储库。

所以我已经下载了最新的 docker 镜像,但重点是:我找不到存储桶的密码。 couchbase 控制台只允许创建用户,但在 spring 中,没有类似用户名/密码这样的用法。它只允许 bucketName 和 password 似乎与 couchbase 5 不兼容。

我在这里遗漏了什么还是 spring 与 couchbase 5 不兼容?如果spring不兼容,哪个版本的couchbase可以?

谢谢

【问题讨论】:

    标签: spring-boot spring-data couchbase spring-data-couchbase


    【解决方案1】:

    Spring Data Couchbase 与 Couchbase Server 5.0 兼容。您可以通过创建与存储桶同名的用户来实现与 4.x 相同的身份验证,然后如果它在 3.0/Kay 之前,则只需使用来自 Spring Data 的存储桶名称和密码。

    文档应该涵盖这一点,如果那里有任何令人困惑的地方,请点击“反馈”按钮并提供可以改进的地方!

    https://developer.couchbase.com/documentation/server/5.0/security/security-authorization.html https://developer.couchbase.com/documentation/server/5.0/security/concepts-rba-for-apps.html https://developer.couchbase.com/documentation/server/5.0/security/security-resources-under-access-control.html

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我通过进入 AbstractCouchbaseConfiguration 开始调试,在那里我找到了

      public abstract class AbstractCouchbaseConfiguration
          extends AbstractCouchbaseDataConfiguration implements CouchbaseConfigurer {
      
        ....//some other configuration
      
      
      @Override
      @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO)
      public ClusterInfo couchbaseClusterInfo() throws Exception {
        return couchbaseCluster().clusterManager(getBucketName(), getBucketPassword()).info();
      }
      

      我所做的是创建了一个与我的 couchbase 用户同名的存储桶。

      couchbase 用户名:用户详细信息

      couchbase 密码 : ******

      存储桶名称:用户详细信息

      【讨论】:

        【解决方案3】:

        Couchbase 驱动程序支持使用用户名/密码连接到 Couchbase 5 存储桶。问题是spring-data-couchbase 的开发速度不够快,无法涵盖 Couchbase 引入的所有新功能。因此,我们需要帮助Spring 使用新的桶连接,通过覆盖spring-data-couchbase 配置基类的Couchbase 集群实例化方法-org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration 来实现。这是我们正在研究的方法:

        @Override
        @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO)
        public ClusterInfo couchbaseClusterInfo() throws Exception {
        return couchbaseCluster().clusterManager(getBucketName(), getBucketPassword()).info();
        }
        

        我们可以看到,它没有使用用户名,只是使用存储桶和密码,所以在我们的配置中,我们将覆盖它如下:

        @Override
        @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO)
        public ClusterInfo couchbaseClusterInfo() throws Exception {
        return couchbaseCluster().authenticate(couchbaseUsername, couchbasePassword).clusterManager().info();
        }
        

        就是这样。这是我的spring-data-couchbase 配置的完整代码:

        import com.couchbase.client.java.Bucket;
        import com.couchbase.client.java.cluster.ClusterInfo;
        import com.couchbase.client.java.env.CouchbaseEnvironment;
        import com.couchbase.client.java.env.DefaultCouchbaseEnvironment;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.core.env.Environment;
        import org.springframework.core.io.Resource;
        import org.springframework.core.io.ResourceLoader;
        import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
        import org.springframework.data.couchbase.config.BeanNames;
        import org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories;
        
        import javax.inject.Inject;
        import java.security.KeyStore;
        import java.util.List;
        
        /**
         * @author by avoinovan
         */
        @Configuration
        @EnableCouchbaseRepositories
        public class ModelConfig extends AbstractCouchbaseConfiguration {
        
            private final static int DEFAULT_HTTP_PORT = 8091;
            private final static int DEFAULT_HTTP_SSL_PORT = 18091;
            private final static int DEFAULT_CARRIER_PORT = 11210;
            private final static int DEFAULT_CARRIER_SSL_PORT = 11207;
        
            private final static long DEFAULT_KEEP_ALIVE_INTERVAL = 30000;
            private final static int DEFAULT_SOCKET_CONNECT_TIMEOUT_MS = 5000;
            private final static long DEFAULT_CONNECT_TIMEOUT_MS = 5000;
            private final static long DEFAULT_MANAGEMENT_TIMEOUT_MS = 75000;
            private final static long DEFAULT_DISCONNECT_TIMEOUT_MS = 25000;
        
            private final static String PROPERTY_KEEP_ALIVE_INTERVAL_MS = "couchbase.keep_alive_interval_ms";
        
            private final static String PROPERTY_SOCKET_CONNECT_TIMEOUT_MS = "couchbase.socket_connect_timeout_ms";
            private final static String PROPERTY_CONNECT_TIMEOUT_MS = "couchbase.connect_timeout_ms";
            private final static String PROPERTY_MANAGEMENT_TIMEOUT_MS = "couchbase.management_timeout_ms";
            private final static String PROPERTY_DISCONNECT_TIMEOUT_MS = "couchbase.disconnect_timeout_ms";
        
            private final static String PROPERTY_SSL_ENABLED = "couchbase.ssl.enabled";
            private final static String PROPERTY_SSL_KEYSTORE_FILE = "couchbase.ssl.keystore.file";
            private final static String PROPERTY_SSL_KEYSTORE_PASSWORD = "couchbase.ssl.keystore.password";
            private final static String PROPERTY_SSL_TRUSTSTORE_FILE = "couchbase.ssl.truststore.file";
            private final static String PROPERTY_SSL_TRUSTSTORE_PASSWORD = "couchbase.ssl.truststore.password";
        
            private final static String PROPERTY_BOOTSTRAP_HTTP_ENABLED = "couchbase.bootstrap.http.enabled";
            private final static String PROPERTY_BOOTSTRAP_HTTP_PORT = "couchbase.bootstrap.http.port";
            private final static String PROPERTY_BOOTSTRAP_HTTP_SSL_PORT = "couchbase.bootstrap.http.ssl.port";
            private final static String PROPERTY_BOOTSTRAP_CARRIER_ENABLED = "couchbase.bootstrap.carrier.enabled";
            private final static String PROPERTY_BOOTSTRAP_CARRIER_PORT = "couchbase.bootstrap.carrier.port";
            private final static String PROPERTY_BOOTSTRAP_CARRIER_SSL_PORT = "couchbase.bootstrap.carrier.ssl.port";
        
            @Value("#{'${spring.couchbase.bootstrap-hosts}'.split(',')}")
            private List<String> couchbaseBootstrapHosts;
        
            @Value("${spring.couchbase.bucket.name}")
            private String bucketName;
        
            @Value("${spring.couchbase.password}")
            private String couchbasePassword;
        
            @Value("${spring.couchbase.username}")
            private String couchbaseUsername;
        
            private final Environment environment;
        
            private final ResourceLoader resourceLoader;
        
            @Inject
            public ModelConfig(final Environment environment,
                               final ResourceLoader resourceLoader) {
                this.environment = environment;
                this.resourceLoader = resourceLoader;
            }
        
            protected List<String> getBootstrapHosts() {
                return couchbaseBootstrapHosts;
            }
        
            protected String getBucketName() {
                return bucketName;
            }
        
            protected String getBucketPassword() {
                return couchbasePassword;
            }
        
            protected CouchbaseEnvironment getEnvironment() {
                return DefaultCouchbaseEnvironment.builder()
                        .keepAliveInterval(environment.getProperty(PROPERTY_KEEP_ALIVE_INTERVAL_MS,
                                Long.class,
                                DEFAULT_KEEP_ALIVE_INTERVAL))
        
                        // timeout settings
                        .socketConnectTimeout(environment.getProperty(PROPERTY_SOCKET_CONNECT_TIMEOUT_MS,
                                Integer.class,
                                DEFAULT_SOCKET_CONNECT_TIMEOUT_MS))
                        .connectTimeout(environment.getProperty(PROPERTY_CONNECT_TIMEOUT_MS,
                                Long.class,
                                DEFAULT_CONNECT_TIMEOUT_MS))
                        .managementTimeout(environment.getProperty(PROPERTY_MANAGEMENT_TIMEOUT_MS,
                                Long.class,
                                DEFAULT_MANAGEMENT_TIMEOUT_MS))
                        .disconnectTimeout(environment.getProperty(PROPERTY_DISCONNECT_TIMEOUT_MS,
                                Long.class,
                                DEFAULT_DISCONNECT_TIMEOUT_MS))
        
                        // port and ssl
                        .sslEnabled(environment.getProperty(PROPERTY_SSL_ENABLED, Boolean.class, false))
                        .bootstrapHttpEnabled(environment.getProperty(PROPERTY_BOOTSTRAP_HTTP_ENABLED,
                                Boolean.class,
                                Boolean.TRUE))
                        .bootstrapHttpDirectPort(environment.getProperty(PROPERTY_BOOTSTRAP_HTTP_PORT,
                                Integer.class,
                                DEFAULT_HTTP_PORT))
                        .bootstrapHttpSslPort(environment.getProperty(PROPERTY_BOOTSTRAP_HTTP_SSL_PORT,
                                Integer.class,
                                DEFAULT_HTTP_SSL_PORT))
                        .bootstrapCarrierEnabled(environment.getProperty(PROPERTY_BOOTSTRAP_CARRIER_ENABLED,
                                Boolean.class,
                                Boolean.TRUE))
                        .bootstrapCarrierDirectPort(environment.getProperty(PROPERTY_BOOTSTRAP_CARRIER_PORT,
                                Integer.class,
                                DEFAULT_CARRIER_PORT))
                        .bootstrapCarrierSslPort(environment.getProperty(PROPERTY_BOOTSTRAP_CARRIER_SSL_PORT,
                                Integer.class,
                                DEFAULT_CARRIER_SSL_PORT))
        
                        // keystore and trust store
                        .sslKeystore(createKeyStore(environment, resourceLoader))
                        .sslTruststore(createTrustStore(environment, resourceLoader))
        
                        .build();
            }
        
            @Override
            @Bean(name = BeanNames.COUCHBASE_CLUSTER_INFO)
            public ClusterInfo couchbaseClusterInfo() throws Exception {
                return couchbaseCluster().authenticate(couchbaseUsername, couchbasePassword).clusterManager().info();
            }
        
            /**
             * Return the {@link Bucket} instance to connect to.
             *
             * @throws Exception on Bean construction failure.
             */
            @Override
            @Bean(destroyMethod = "close", name = BeanNames.COUCHBASE_BUCKET)
            public Bucket couchbaseClient() throws Exception {
                //@Bean method can use another @Bean method in the same @Configuration by directly invoking it
                return couchbaseCluster().openBucket(getBucketName());
            }
        
            private KeyStore createKeyStore(final Environment environment, final ResourceLoader resourceLoader) {
                return loadKeyStore(environment, resourceLoader, PROPERTY_SSL_KEYSTORE_FILE, PROPERTY_SSL_KEYSTORE_PASSWORD);
            }
        
            private KeyStore createTrustStore(final Environment environment, final ResourceLoader resourceLoader) {
                return loadKeyStore(environment, resourceLoader, PROPERTY_SSL_TRUSTSTORE_FILE, PROPERTY_SSL_TRUSTSTORE_PASSWORD);
            }
        
            private KeyStore loadKeyStore(final Environment environment,
                                          final ResourceLoader resourceLoader,
                                          final String fileProperty,
                                          final String passwordProperty) {
                String file = environment.getProperty(fileProperty);
                String password = environment.getProperty(passwordProperty);
        
                if (file != null) {
                    Resource resource = resourceLoader.getResource(file);
                    if (resource != null) {
                        try {
                            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                            keyStore.load(resource.getInputStream(), password == null ? null : password.toCharArray());
                            return keyStore;
                        } catch (final Exception e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
                return null;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-19
          • 1970-01-01
          • 2015-11-24
          相关资源
          最近更新 更多