如何使用 Spring 中的注释定义 PasswordEncoder?

How do I define a PasswordEncoder using annotations in Spring?

我正在使用 Spring-Boot v1.3.0.M2。我正在尝试使用注释定义 o.s.s.c.p.PasswordEncoder 。我的配置 class 如下所示。这个例子工作正常。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 @Bean
 public PasswordEncoder getPasswordEncoder() { 
  return new StandardPasswordEncoder();
 }
}

但是,我想用一个秘密来实例化 StandardPasswordEncoder,并且我修改了我的 class 如下。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 @Autowired
 @Value(value="${password.secret}")
 private String secret;

 @Bean
 public PasswordEncoder getPasswordEncoder() { 
  return new StandardPasswordEncoder(secret);
 }
}

请注意我的 Spring- 启动应用程序如下所示。

@SpringBootApplication
@PropertySource("classpath:/config/myapp.properties")
public class Application {
 public static void main(String[] args) {
  SpringApplications.run(Application.class, args);
 }

 @Bean
 public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholdConfigurer() {
  return new PropertySourcesPlaceholderConfigurer();
 }
}

我的 myapp.properties 如下所示。

password.secret=fsdkjfsldfsdfsdfsdf

当我尝试 运行 我的 Spring-Boot 应用程序时,出现以下异常。


Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.crypto.password.PasswordEncoder]: Circular reference involving containing bean 'webSecurityConfig' - consider declaring the factory method as static for independence from its containing instance. Factory method 'getPasswordEncoder' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 102 more

无法实例化 PasswordEncoder,因为未设置字段 private String secret;,因此 NullPointerException (NPE)。我尝试将方法 getPasswordEncoder 和字段 secret 设为静态,但这没有帮助。

关于如何使用注释获取带有秘密的 PasswordEncoder 实例的任何想法?

我通过修改找到了答案。我删除了字段 secret 并简单地用方法注释了参数,如下所示。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 @Bean
 public PasswordEncoder getPasswordEncoder(@Value(value="${password.secret}") String secret) { 
  return new StandardPasswordEncoder(secret);
 }
}

一个 bcrypt 密码加密器,Spring recommends 通过 SHA 或 MD5,可以这样配置:

@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder();
}