BCryptPasswordEncoder 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 'не найдено, если для этого действительно существует класс конфигурации.

Огромное спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 448
2

Ответы 2

Похоже, вашего класса веб-конфигуратора нет в пакете com.eficacia.security или в одном из его подпакетов.

Переместите WebMvcConfiguration в место внутри пакетов @ComponentScaned.

Хорошо, вы имеете в виду, что вы перемещаете класс WebMvcConfiguration внутри пакета com.eficacia.security?

AlejoDev 09.11.2018 15:36

@AlejoDev Да, переместите его внутрь com.eficacia.security или любого из его подпакетов.

Markus Pscheidt 09.11.2018 15:39

Spring Security сканирует все ваши пакеты при запуске, если ваш класс WebMvcConfiguration вне пакета безопасности, он не распознает по умолчанию.

Habil 09.11.2018 15:41

@AlejoDev А аннотацию @ComponentScan убирать не пробовали?

Markus Pscheidt 09.11.2018 19:07

@AlejoDev Другой вопрос: в каком пакете находится ваш основной файл Application.java (тот, который имеет аннотацию @SpringBootApplication? Есть ли у @SpringBootApplication атрибут scanBasePackages?

Markus Pscheidt 09.11.2018 19:10

@MarkusPscheidt Нет, нет атрибута scanBasePackages

AlejoDev 09.11.2018 19:12

В каком пакете находится основной файл Application.java (тот, который имеет аннотацию @SpringBootApplication)?

Markus Pscheidt 09.11.2018 19:13

Позвольте нам продолжить обсуждение в чате.

AlejoDev 09.11.2018 19:14

com.eficacia - это пакет

AlejoDev 09.11.2018 19:17

Вы создаете bean-компонент типа PasswordEncoder и пытаетесь автоматически подключить 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

@AlejoDev Обновленный ответ

Mykhailo Moskura 09.11.2018 15:57

Здравствуйте, я очень признателен за вашу помощь, если я попробовал, но это не сработало, я нашел очень простой способ, я просто инициализировал объект вручную, используя зарезервированное слово new

AlejoDev 12.11.2018 20:12

@AlejoDev, не могли бы вы показать образец где не заработало?)

Mykhailo Moskura 12.11.2018 20:40

Другие вопросы по теме