我一直在尝试按照这里的教程加密密码https://www.baeldung.com/spring-security-registration-password-encoding-bcrypt. 我创建了bean,但有一个很常见的问题,即我的自动连接字段从未被注入。我已经尝试解决这个问题很长一段时间了,在这里遵循各种建议,比如下面的资源为什么我的spring@autowired字段是空的?但这些帮助似乎都不起作用,我真的不太确定我哪里出了问题。我甚至试着把bean放到xml中,尽管我也不能让它工作。
以下是我目前的代码:
用户类,其中autowired字段为空
@Service
@Configurable
public class User {
@Id
private UUID id;
private long alias;
private String username;
private String password;
@Autowired
private PasswordEncoder passwordEncoder;
设置bean的配置类:
@Configuration
public class Config {
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}
我对spring还很陌生,所以很抱歉,如果这是一个非常刺眼的补丁,我只是不知道如何才能让它工作。谢谢你的帮助。
使用限定符更新了代码:
配置类:
@Configuration
public class Config {
@Bean("bCryptPasswordEncoder")
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
用户类别:
@Autowired
@Qualifier("bCryptPasswordEncoder")
private PasswordEncoder passwordEncoder;
如何示例化用户:
@PostMapping("/users")
public String newUser(@RequestBody User newUser) {
if (repository.existsByUsername(newUser.getUsername())){
return new UserAlreadyExistsException(newUser.getUsername()).getMessage(newUser.getUsername(), repository);
}
User u = new User(getAlias(repository), newUser.getUsername(), newUser.getPassword());
repository.save(u);
return "{\"message\" : \"user\", \"user\" : " + u.toString() + "}";
}
1条答案
按热度按时间2guxujil1#
您正在尝试注入接口,spring不知道从哪个实现中选择。
要解决此问题,请添加以下内容:
和
请参见:
baeldung限定符
如果您使用的是构造函数注入(强烈建议),那么可以在构造函数中的变量前面添加@qualifier(“bcryptpasswordencoder”),如下所示:
附笔
为了将来的兼容性,我强烈建议使用spring5授权密码编码器
baeldung授权密码编码器示例
p、 p.s用户是一个数据成员,不应该持有密码编码器,在数据成员和业务逻辑(search-spring-layer架构)之间建立分离是一种很好的设计模式,
如果这是一个新项目,我会更进一步,看看洋葱架构:洋葱架构
p、 另外,我建议你看看Lombok山项目:)