Использование Bcrypt весной - PullRequest
2 голосов
/ 06 апреля 2019

Я делаю локальный вход в систему и правильно знаю, что мой пароль хранится в базе данных h2 в виде простого текста.

Я хочу использовать Bcrypt весной, но я получаю эту ошибку при запуске приложения:

Field bCryptPasswordEncoder in com.alert.interservices.uaa.Bootstrap required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found.

Чтобы использовать Bcrypt, я подключил его только в моем контроллере и зашифровал пароль.Я сделал то же самое на моем Bootstrap при заполнении базы данных:

Контроллер:

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

/**
 * 
 * @param user the user that is trying to access
 * @return the user if it is successfull or a bad request if not
 */
@RequestMapping(value = "/authenticate", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Object authenticate(@RequestBody UserEntity user) {

    logger.debug("Begin request UAAController.authenticate()");

    String encriptedPasswd=bCryptPasswordEncoder.encode(user.getPassword().getPassword());

    UserEntity usr = authenticationService.authenticate(user.getName(), encriptedPasswd);

    (...)

Bootstrap:

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

@GetMapping("/test")
public void fillDatabse() {


    String encodedPw=bCryptPasswordEncoder.encode("test");
    Password p = new Password(encodedPw);

Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 06 апреля 2019

BCryptPasswordEncoder не является бобом, вы не можете подключить его автоматически.

использование:

Password p = new Password(new BCryptPasswordEncoder().encode(encodedPw));

вместо

String encodedPw=bCryptPasswordEncoder.encode("test");
Password p = new Password(encodedPw);

и удалите

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

Также внесите эти изменения в свой контроллер

1 голос
/ 06 апреля 2019

Вы можете предоставить bean-компонент BCryptPasswordEncoder, поместив следующий код в любой из ваших отсканированных классов, помеченных @SpringBootApplication, @Configuration ...

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
}

См. Пример в рабочем проекте .

0 голосов
/ 06 апреля 2019

Ваша проблема связана с тем, как вы пытаетесь ввести кодировщик пароля (это видно из получаемого вами сообщения об ошибке).

Вы не можете просто попытаться внедрить реализацию интерфейса PasswordEncoder, в данном случае BCryptPasswordEncoder таким способом. Если вы хотите, чтобы он был легкодоступным и в контексте Spring (таким образом, доступным для инъекций при необходимости), вам нужно придерживаться другого подхода.

Создание экземпляра компонента вручную где-нибудь и отображение его в контексте с помощью аннотации bean. Затем введите его, когда это необходимо. Простым примером вам будет следующее:

1) Создайте сервис с именем PasswordService примерно так:

@Service
public final class PasswordService {

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

}

Как упомянуто выше, это приведёт экземпляр кодировщика пароля в контекст.

Затем используйте его таким образом, когда это необходимо:

@Autowired
private PasswordEncoder passwordEncoder

Вы фактически избежите создания экземпляра кодировщика каждый раз вручную.

...