在我的配置中,我有这个:
@Autowired
private PasswordEncoder passwordEncoder;
@Bean
public PasswordEncoder passwordEncoderBean() {
return new BCryptPasswordEncoder();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
// @Autowired
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(jwtUserDetailsService)
.passwordEncoder(passwordEncoder);
}
此代码可以正常工作。但是,如果我从passwordEncoder
中删除@Autowired,则必须在configure
方法上添加@Autowired。但是此规则不适用于authenticationManagerBean()
方法。我已经搜索并阅读了很多教程和文章,但我不知道这是如何工作的。谁能解释?
答案 0 :(得分:1)
查看此URL https://spring.io/guides/topicals/spring-security-architecture/ 似乎您在这里将WireManager AuthenticationManagerBuilder身份验证为@Bean。
配置(AuthenticationManagerBuilder auth),因此在这种情况下将可以使用,并且passwordEncoder也自动连接。
答案 1 :(得分:1)
似乎您使用的是Spring批注配置,
如果您不向方法或字段中添加Spring注释,则Spring不知道需要对其进行初始化,因此在Spring上下文中使用(也无需在Spring外部对其进行初始化)时,对象将为空
答案 2 :(得分:1)
出于安全原因,您需要避免以明文形式存储密码。基于此原理,您可以使用此选项对密码进行编码。
在您的示例中,您使用的是 PasswordEncoder 界面:
.passwordEncoder(passwordEncoder);
使用这种方法,您必须告知一个实现。在Spring中,您可以使用@Autowired(在声明中或类似使用 PasswordEncoder 接口的方法上的代码)注入此实现。
只是一个问题...为什么创建一个实现?
public PasswordEncoder passwordEncoderBean(){...
我认为可以将这种方法替换为您的Autowired编码接口。