java - 为什么我使用 Spring Boot 得到 "NOAUTH Authentication required"?

标签 java spring spring-boot redis

我有一个使用密码运行的简单 Redis 服务器。我想通过我的 spring boot 应用程序与它交谈。我看here并看到有一个 spring.redis.password 所以我的 application-local.yml(使用 -Dspring.profiles.active=local 运行)看起来像...

spring:
  redis:
    password: ... 

但是当我运行的时候我得到了

NOAUTH Authentication required

我错过了什么?我可以像...一样通过 node.js 进行连接

import redis from "redis";

const client = redis.createClient({
 password: "..."
});

附加代码

@Bean
LettuceConnectionFactory redisConnectionFactory(){
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    return new LettuceConnectionFactory(config);
}

@Bean
public RedisTemplate<String, Object> redisTemplate(){
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory());
    return template;
}

也试过...

@Bean
LettuceConnectionFactory redisConnectionFactory(){
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    if (redisPassword != null){
        config.setPassword(redisPassword);
    }
    return new LettuceConnectionFactory(config);
}

这可行,但由于它是标准属性,所以看起来过于冗长。

最佳答案

如果您需要不那么冗长的配置,您可以从配置代码中删除 RedisConnectionFactory bean,然后将 RedisConnectionFactory bean 注入(inject)到您的 redisTemplate 中。 redisConnectionFactory 将使用 application.yml 中的属性进行填充:

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

在这种情况下,Spring 默认注入(inject) LettuceConnectionFactory

问题出在这里:new RedisStandaloneConfiguration()。如果您查看构造函数的代码,您会看到创建了空密码,并且除了调用 setter 之外无法设置它。


旧答案:您需要通过 RedisProperties 类从 application.yml 获取数据。试试这个:

@Bean
RedisConnectionFactory redisConnectionFactory(RedisProperties props) {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();

    config.setPassword(props.getPassword());

    return new LettuceConnectionFactory(config);
}

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

这里 props 包含来自 spring.redis 部分的属性

关于java - 为什么我使用 Spring Boot 得到 "NOAUTH Authentication required"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64775186/

相关文章:

用于单点登录的 Spring Oauth2 ResourceOwnerPassword 流程

java - Tooltip:如何获取触发提示的鼠标坐标?

java - 获取字符的unicode值

java - 如何在java中找到两个日期之间的差异持续时间?

java - 做一个API,构造函数仅供系统私有(private)使用,另一个官方的,javadoc'ed和公共(public)使用的。关于修复/模式方法的建议

java - Spring boot 能够接受 Enum 作为请求参数

java - Spring MVC 初始化一个对象

java - 无法确定合适的驱动程序类别

java - 在 Hibernate/JPA 中,我应该在哪里以及在哪个用例中使用 SessionFactory 和 Session

spring-security - 如何在 jhipster 中通过 OAuth2 成功登录时执行操作