如何使用 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();
}
我正在使用 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();
}