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

时间:2015-08-12 18:09:02

标签: java spring spring-boot spring-annotations

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

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

但是,我想用一个秘密实例化StandardPasswordEncoder,我修改了我的课程如下。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

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

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

@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实例的任何想法?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我通过修补一点找到答案。我删除了字段secret,只需使用方法注释参数,如下所示。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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