BCryptPasswordEncoder Spring Security未定义

时间:2018-11-09 14:01:14

标签: java spring spring-boot spring-security

嗨,我开发了一个Spring Boot应用程序(v1.5.18.BUILD-SNAPSHOT),但是当我尝试启动该应用程序时,这失败了。...

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.eficacia.security.WebSecurity required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' in your configuration.

问题是我配置了bean:

@Configuration
public class AppConfiguration {

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

在我的pom.xml中:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency>

WebSecurity:

@Configuration
@EnableWebSecurity
@ComponentScan({"com.eficacia.security"})
public class WebSecurity extends WebSecurityConfigurerAdapter {

    public static final String USER_REGISTRATION_URL = "/v1/user";

    private UserDetailsService userDetailsService;

    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public WebSecurity(UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userDetailsService = userDetailsService;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
        .authorizeRequests().antMatchers(HttpMethod.POST, USER_REGISTRATION_URL).permitAll()
        .anyRequest().authenticated()
        .and().addFilter(new JWTAuthenticationFilter(authenticationManager(), getApplicationContext()))
        .addFilter(new JWTAuthorizationFilter(authenticationManager(), getApplicationContext()))
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        //configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200","http://opusclick.com","https://gateway2.tucompra.com.co"));
        configuration.addAllowedOrigin("*");
        configuration.addAllowedHeader("*");
        configuration.setAllowedMethods(Arrays.asList("GET","POST","PUT","PATCH","DELETE"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

}

WebConfigurer:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    private final ApplicationContext applicationContext;
    private final EntityManager entityManager;

    @Autowired
    public WebMvcConfiguration(ApplicationContext applicationContext, EntityManager entityManager) {
        this.applicationContext = applicationContext;
        this.entityManager = entityManager;
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
        argumentResolvers.add(new DTOModelMapper(objectMapper, entityManager));
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            JacksonMapperConfiguration jacksonMapperConfiguration= new JacksonMapperConfiguration();
        converters.add(jacksonMapperConfiguration.mappingJackson2HttpMessageConverter());
        super.configureMessageConverters(converters);
    }
}

我的问题很简单,这就是为什么如果确实存在配置类,为什么找不到类'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder '的定义

非常感谢!

2 个答案:

答案 0 :(得分:1)

好像您的Web配置器类不在软件包com.eficacia.security或其子软件包之一中。

WebMvcConfiguration移动到@ComponentScan版本的程序包中。

答案 1 :(得分:1)

您正在创建类型为PasswordEncoder的bean,并尝试自动装配BCryptPasswordEncoder

@Configuration
public class AppConfiguration {

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

更改此:

私有BCryptPasswordEncoder bCryptPasswordEncoder;

public WebSecurity(UserDetailsService userDetailsService, 
   BCryptPasswordEncoder bCryptPasswordEncoder) {
    this.userDetailsService = userDetailsService;
    this.bCryptPasswordEncoder = bCryptPasswordEncoder;
}

对此:   私人PasswordEncoder passwordEncoder;

public WebSecurity(UserDetailsService userDetailsService, 
   PasswordEncoder passwordEncoder ) {
    this.userDetailsService = userDetailsService;
    this.passwordEncoder = PasswordEncoder ;
}

Spring could not found the BcryptPasswordEncoder type as you are returning PasswordEncoder