升级到 Spring boot 2.3.5.RELEASE 后 Cassandra 身份验证问题

red*_*alo 5 java cassandra spring-boot

我们正在升级到 Spring boot 2.3.5.RELEASE。我们的应用程序将 cassandra 作为数据库之一,并且我们在节点上启用了身份验证。在更新 Spring Boot 版本后尝试连接到 casssandra 数据库时,我收到此异常并且无法启动应用程序。

Authentication error on node <IP:PORT> requires authentication (org.apache.cassandra.auth.PasswordAuthenticator), but no authenticator configured
Run Code Online (Sandbox Code Playgroud)

我的卡桑德拉配置如下:

   @Configuration
   @ConfigurationProperties("spring.data.cassandra.keyspaceName")
   @EnableCassandraRepositories(basePackages = { "com.company.project.feature.cassandra.repo" }, 
    cassandraTemplateRef = "dbTemplate")
  public class Config extends AbstractCassandraConfiguration {

@Autowired
ServerProperties serverProps;

protected String contactPoints;
protected Integer port;
protected String keyspaceName;
protected String localDataCenter;


@Override
public String getContactPoints() {
    return contactPoints;
}

/**
 * @param contactPoints
 */
public void setContactPoints(String contactPoints) {
    this.contactPoints = contactPoints;
}

/**
 * @param keyspaceName
 */
public void setKeyspaceName(String keyspaceName) {
    this.keyspaceName = keyspaceName;
}

@Override
public String getKeyspaceName() {
    return keyspaceName;
}

@Override
public int getPort() {
    return port;
}

public void setLocalDataCenter(String localDataCenter) {
    this.localDataCenter = localDataCenter;
}

@Override
public String getLocalDataCenter() {
    return localDataCenter;
}

public void setPort(Integer port) {
    this.port = port;
}

@Bean(name = "dbSession")
@Primary
public CqlSession session() {

    String containerIpAddress = getContactPoints();
    int containerPort = getPort();
    InetSocketAddress containerEndPoint = new InetSocketAddress(containerIpAddress, containerPort);
    
    CqlSessionBuilder builder = CqlSession.builder().withLocalDatacenter(getLocalDataCenter()).addContactPoint(containerEndPoint)
    .withAuthCredentials(serverProps.getCassandraUserName(), serverProps.getCassandraPassword())
    .withKeyspace(getKeyspaceName());
    
    
    return builder.build();
}


@Bean("dbOperations")
public CassandraOperations cassandraOperationsB() {
    return new CassandraTemplate(session(), cassandraConverter());
}

@Primary
@Bean(name = "dbTemplate")
@Override
public CassandraAdminTemplate cassandraTemplate() {
    return new CassandraAdminTemplate(session(), cassandraConverter());
}
Run Code Online (Sandbox Code Playgroud)

}

我在构建 CqlSession 时提供了用户名和密码,但仍然面临此异常。我做错了什么吗?

dil*_*aik 13

在较旧的 Spring 数据版本中,您可以使用:CassandraClusterFactoryBean. 但这里是一个未来的例子,如果其他人无意中使用了 spring data cassandra 3.0.1,用户名和密码身份验证作为spring data 文档,如果您滚动到页面末尾,那么您将看到CassandraClusterFactoryBean被删除,而不是我们现在拥有的CqlSessionFactoryBean。所以示例代码看起来像

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;
import org.springframework.data.cassandra.config.CqlSessionFactoryBean;

@Configuration
@EnableCassandraRepositories(basePackages = {"com.some.package"})
@ConfigurationProperties(prefix = "spring.data.cassandra")
@Getter
@Setter
public class CassandraConfig extends AbstractCassandraConfiguration {

    private String keyspaceName;
    private String contactPoints;
    private int port;
    private String localDataCenter;
    private String username;
    private String password;

    @Bean
    @Override
    public CqlSessionFactoryBean cassandraSession() {
        CqlSessionFactoryBean cassandraSession = super.cassandraSession();//super session should be called only once
        cassandraSession.setUsername(username);
        cassandraSession.setPassword(password);
        return cassandraSession;
    }

}
Run Code Online (Sandbox Code Playgroud)