В предыдущем посте мы использовали сервис сведений о пользователе, чтобы обеспечить способ загрузки наших данных из функции на основе заданного имени пользователя.
Реализация пользовательских данных может быть подкреплена механизмом в памяти, базой данных sql / no-sql и т. Д.
Варианты не ограничены.
На хранение паролей мы должны обратить внимание, это хэширование паролей.
В целях безопасности мы хотим хранить пароли в хешированном виде.
Предположим, кто-то получит несанкционированный доступ к таблице, хранящей наши пользовательские данные. Храня пароли в открытом виде, этот человек может восстановить пароль каждого пользователя в системе.
Поэтому мы хотим, чтобы наши пароли хешировались до их сохранения в базе данных.
Всегда помните, что ваше хеширование должно быть надежным и актуальным.
Например, MD5 был очень популярен в прошлом, но в настоящее время ведет к плохой безопасности. На самом деле, можно легко взломать пароли MD5, если вы используете GPU .
Spring Security предоставляет нам готовые функциональные возможности, когда дело доходит до кодирования паролей.
Кодировщик паролей — это интерфейс, который используется в процессе авторизации.
01
02
03
04
05
06
07
08
09
10
|
package org.springframework.security.crypto.password; public interface PasswordEncoder { String encode(CharSequence rawPassword); boolean matches(CharSequence rawPassword, String encodedPassword); } |
Функция кодирования должна использоваться для кодирования вашего пароля, а функция совпадений проверит, соответствует ли ваш необработанный пароль кодированному паролю. Как только ваша служба пользовательских данных извлекает информацию о пользователе из базы данных, пароль, указанный для авторизации, должен быть проверен с паролем, полученным из базы данных. В этом случае весна будет использовать функцию совпадений.
Теперь Spring предоставляет нам различные реализации кодировщика паролей.
Давайте попробуем создать бин-кодировщик паролей.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.gkatzioura.security.passwordencoder.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration public class PasswordEncoderConfig { @Bean public PasswordEncoder passwordEncoder() { return new PasswordEncoder() { @Override public String encode(CharSequence rawPassword) { return rawPassword.toString(); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return rawPassword.toString().equals(encodedPassword); } }; } } |
Этот bean-компонент ничем не отличается от NoOpPasswordEncoder, который поставляется с весенней загрузкой.
Нет, мы собираемся провести небольшой эксперимент и добавить собственный кодировщик паролей.
Наш кодировщик паролей будет сравнивать открытый текстовый пароль, предоставленный пользователем, хэширующий его, и сравнивать его с уже хэшированным паролем от эквивалентного пользователя в нашей базе данных.
Для хеширования мы будем использовать bcrypt.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Bean public PasswordEncoder customPasswordEncoder() { return new PasswordEncoder() { @Override public String encode(CharSequence rawPassword) { return BCrypt.hashpw(rawPassword.toString(), BCrypt.gensalt( 4 )); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return BCrypt.checkpw(rawPassword.toString(), encodedPassword); } }; } |
Чтобы проверить это, мы настроим нашу безопасность, используя переменные среды, как мы видели в предыдущем посте .
Сначала нам нужно закодировать наш пароль. Наша система не будет хранить пароль в виде открытого текста.
1
2
|
System.out.println(BCrypt.hashpw( "user-password" ,BCrypt.gensalt(4))); $2a$04$i4UWtMw6surai4dQMhoKSeLddi1XlAh2sSyG58K3ZvBHqVkhz8Y3y |
Итак, что мы собираемся сделать дальше, это установить переменные среды перед запуском нашего весеннего загрузочного приложения.
1
2
|
SPRING_SECURITY_USER_NAME= test -user SPRING_SECURITY_USER_PASSWORD=$2a$04$i4UWtMw6surai4dQMhoKSeLddi1XlAh2sSyG58K3ZvBHqVkhz8Y3y |
Следующий шаг — перейти на экран входа в систему и указать учетные данные user-name и user-password.
Как вы можете видеть, вы только что были аутентифицированы.
За кулисами весна хэширует пароль, который вы отправили, и сравнивает его с существующим через переменные среды.
Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Spring Security с Spring Boot 2.0: кодировщик паролей
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |