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

5
我们正在升级到Spring Boot 2.3.5.RELEASE。我们的应用程序有Cassandra作为其中一个数据库,并且我们已经在节点上启用了身份验证。在更新Spring Boot版本后尝试连接Cassandra数据库时,我遇到了这个异常,无法启动应用程序。
Authentication error on node <IP:PORT> requires authentication (org.apache.cassandra.auth.PasswordAuthenticator), but no authenticator configured

我的Cassandra配置如下:
   @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());
}

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

1个回答

12

在旧版本的Spring Data中,您可以使用: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;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接