簡體   English   中英

如何在Spring中使用注釋定義PasswordEncoder?

[英]How do I define a PasswordEncoder using annotations in Spring?

我正在使用Spring-Boot v1.3.0.M2。 我正在嘗試使用注釋定義osscpPasswordEncoder 我的配置類如下所示。 這個例子很好用。

@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

因為字段private String secret;所以無法實例化PasswordEncoder private String secret; 未設置,因此NullPointerException (NPE)。 我試圖使方法getPasswordEncoder以及字段secret靜態的,但這無濟於事。

關於如何使用注釋來秘密獲取PasswordEncoder實例的任何想法?

Spring推薦在SHA或MD5上使用的bcrypt密碼加密器可以這樣配置:

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

我通過修補找到了答案。 我刪除了字段secret ,僅使用方法對參數進行了注釋,如下所示。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM