Как использовать Spring Security без шифрования пароля? - PullRequest
0 голосов
/ 06 июля 2018

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

Код:

@Override
    public void saveUser(User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        user.setActive(1);
        Role userRole = roleRepository.findByRole("ADMIN");
        user.setRoles(new HashSet<Role>(Arrays.asList(userRole)));
        userRepository.save(user);
    }

Затем использовал его во время аутентификации, и пользователь проходил аутентификацию, как и ожидалось.

@Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.
            jdbcAuthentication()
                .usersByUsernameQuery(usersQuery)
                .authoritiesByUsernameQuery(rolesQuery)
                .dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
    }

Затем я удалил .passwordEncoder(bCryptPasswordEncoder); из метода configure(), однако пользователи с зашифрованным паролем успешно проходят аутентификацию.

Затем я удалил кодировщик паролей из метода saveUser() и configure() и сохранил User в базе данных (т.е. без кодирования пароля) и попытался получить доступ к аутентифицированной странице, но я получил AccessedDeniedException,

Но пользователи с зашифрованным паролем все равно проходят аутентификацию, хотя я удалил passwordEncoder() из configure() метода. Почему это происходит?

Использует ли Spring Security по умолчанию кодировщик паролей во время аутентификации?

Если да, то как использовать Spring Security без шифрования пароля?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Может быть, вы сможете реализовать этот простой код, чтобы избежать Spring Encoder

public class PasswordEnconderTest implements PasswordEncoder {
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return charSequence.toString().equals(s);
    }
}

и добавьте в свой WebSecurityConfig:

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

это не рекомендуется, но вы можете реализовать

0 голосов
/ 06 июля 2018

В Spring Security 5 шифрование паролей всегда включено. По умолчанию используется шифрование bcrypt. Отличительной особенностью Spring Security 5 является то, что он позволяет вам указать в своем пароле, какое шифрование использовалось для создания has.

Об этом см. Формат хранения пароля в Справочном руководстве по безопасности Spring. Короче говоря, это позволяет вам префикс вашего пароля для хорошо известного ключа к алгоритму. Формат хранения {<encryption>}<your-password-hash>.

Когда ничего не используется, он становится {noop}your-password (который будет использовать NoOpPasswordEncoder, а {bcrypt}$a2...... будет использовать BcryptPasswordEncoder. Существует несколько поддерживаемых алгоритмов, но вы также можете определить свой собственный.

Чтобы определить свой собственный, создайте свой собственный PasswordEncoder и зарегистрируйте его под ключом с помощью DelegatingPasswordEncoder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...