Компонент agile-security: компонент для аутентификации
Данный компонент был разработан на основе spring-security с большим количеством настроек, что позволяет легко интегрировать его в нашу систему.
При разработке компонента максимально соблюдалась структура spring-security, чтобы избежать ненужного проектирования. В процессе разработки было оставлено много расширяемых интерфейсов для обеспечения максимальной поддержки вторичной разработки. Особенностью компонента является то, что он предоставляет большую поддержку в сценариях разделения передней и задней части, а также использует кэш для хранения информации об учётных записях по умолчанию.
Особенности:
JWT + автоматическое продление срока действия токена + принудительное аннулирование: токен генерируется с использованием JWT, и срок действия токена автоматически продлевается и принудительно аннулируется с помощью компонента agile-cache.
Настраиваемый способ передачи токенов: встроенная поддержка заголовков (header) и файлов cookie для передачи токенов, которые можно настроить в соответствии с уровнем безопасности конкретного сценария.
Динамические токены: предоставляются простые и сложные стратегии генерации токенов. По умолчанию простая стратегия обеспечивает общий токен для всего сеанса от входа до выхода. Сложная стратегия предполагает использование нового токена для каждого взаимодействия и аннулирование предыдущего токена, обеспечивая уникальность каждого токена. Однако сложная стратегия требует поддержки со стороны клиента, так как неудачная передача токена может привести к тому, что все последующие запросы будут считаться незаконными. Поэтому сложная стратегия не рекомендуется без обеспечения высокой степени взаимодействия между клиентом и сервером.
Индивидуальная регистрация учётных записей: здесь доступны три варианта регистрации:
Возможность настройки: пакет cloud.agileframework.security.provider предоставляет множество точек расширения, таких как LoginValidateProvider для проверки входа, PasswordProvider для расшифровки паролей и SecurityResultProvider для обработки результатов аутентификации.
Постоянное хранение данных: по умолчанию данные учётных записей сохраняются в памяти. Разработчики могут внедрить собственные интерфейсы для реализации пользовательских стратегий постоянного хранения, таких как MySQL, расширение учётных данных с почтовыми адресами и т. д.
Кластеры и распределённые системы: компонент аутентификации использует безгосударственные сервисы для хранения критически важных данных аутентификации в кэше, где кэш управляется компонентом agile-cache. При работе в кластерных или распределённых средах agile-cache можно настроить для использования сторонних систем кэширования, таких как Redis, для обеспечения безгосударственной аутентификации.
Проверка подлинности: проверка подлинности обеспечивается компонентом spring-boot-starter-kaptcha, который также включает в себя переключатель и метаданные конфигурации для проверки подлинности. Эта проверка подлинности также поддерживает распределённую/кластерную аутентификацию, предотвращая проблемы с проверкой подлинности при выдаче и проверке подлинности на разных серверах.
Оценка надёжности пароля: инструмент cloud.agileframework.security.util.PasswordUtil предоставляет оценку надёжности паролей, включая настраиваемые правила и весовые коэффициенты. Оценка надёжности основана на процентах и учитывает такие факторы, как AA BB, ABCABC, последовательность клавиш, цифровые символы, ключевые слова, длина и разнообразие символов.
Имитация учётных записей: можно использовать JSON-файлы для имитации учётных записей для тестирования и разработки.
Ограничение количества попыток входа: после определённого количества неудачных попыток входа можно заблокировать дальнейшие попытки входа. Можно настроить интервал между неудачными попытками и продолжительность блокировки.
Блокировка входа: поддерживается три типа блокировок входа, которые могут использоваться отдельно или в комбинации, например, блокировка сеансов браузера для определённых IP-адресов или блокировка учётных записей для определённых IP-адресов.
MVC-параметры учётных записей: встроенные типы параметров для анализа параметров учётных записей, поддерживающие распознавание параметров типа UserDetails в контроллере.
Начало работы:
Начало работы с проектом очень просто.
Скачайте пакет: вы можете скачать пакет с последней стабильной версией с GitHub (https://github.com/mydeathtrial/agile-security/releases). Пакет уже загружен в центральный репозиторий Maven, и его можно напрямую объявить в pom.xml.
Добавьте зависимость Maven: объявите центральный репозиторий и зависимость Maven.
Настройте переключатель: настройте переключатель в файле свойств.
Войдите и выйдите: используйте стандартные URL-адреса для входа и выхода.
Конфигурация:
В файле свойств можно настроить различные параметры, такие как включение или отключение компонента аутентификации, исключение URL-адресов из аутентификации, URL-адреса входа и выхода, ключи для имени пользователя и пароля при входе и время ожидания токена. Клиентский реальный IP, имя параметра в заголовке запроса:
X-Real-Ip
Пароль:
Минимальная сила (в настоящее время не используется): 5
Срок действия (в настоящее время не используется): 31 день
Ключ передачи (в настоящее время не используется): 167223764989834
Смещение передачи (в настоящее время не используется): 3612213421341234
Алгоритм модели передачи (в настоящее время не используется): AES/CBC/PKCS5Padding
Конфигурация проверки силы пароля:
Стратегия соответствия ключевых слов для определения силы пароля:
Ключевые слова для пароля: password, iloveyou, sunshine, 1314, 520, a1b2c3, admin
Общий вес ключевых слов: 0,35
Стратегии и веса регулярных выражений для определения силы пароля:
Регулярное выражение | Вес |
---|---|
(?:([\da-zA-Z])\1{2,}) | 0.4 |
(?:([\da-zA-Z])\1+){2,} | 0.15 |
([\da-zA-Z]{2,})\1+ | 0.12 |
((?:0(?=1) | 1(?=2) |
((?:a(?=b) | b(?=c) |
((((19 | 20)\d{2})-(0?[13-9] |
Общий вес регулярных выражений: 0.65
Максимальная оценка за длину: 32
Настройки ограничения при неудачной попытке входа:
Включить ограничение при неудачном входе: true
Блокировать ли после истечения срока действия (true — блокировать, false — не блокировать): true
Максимальное количество неудачных попыток входа: 5
Время блокировки после неудачного входа: 3 минуты
Интервал времени между неудачными попытками входа: 1 минута
Объекты ограничения при неудачном входе (ip, аккаунт, session_id): account, ip, session_id
Адрес переадресации при неудачном входе (fail): /fail
Адрес успешной переадресации (success): /success
Адрес успешного выхода (success-logout-forward-url): /logout-success
Данные фиктивного пользователя:
Имя пользователя: admin2
Пароль: $2a$04$H5Zj6JmtZRyyrVKKMsJmO.txNXcRQNWxo5C.d0KoijnlqCbGdi0fq
Статус активации: true
Не истёк срок действия: true
Аккаунт не заблокирован: false
Не истекла сила пароля: true
Полномочия: []
Стратегия входа: MORE
Тип данных фиктивного пользователя: cloud.agileframework.security.filter.login.InMemoryUserDetails
Включение фиктивных пользователей: false Глубокая кастомизация
В примере с использованием JPA и класса фреймворка в качестве примера, класс ORM-отображения информации о пользователях должен соответствовать интерфейсу cloud.agileframework.security.filter.login.CustomerUserDetails. Этот интерфейс определяет необходимую информацию об учётной записи, такую как имя пользователя, пароль и набор разрешений.
Инструменты для операций на уровне сохраняемости (например, xxxService) должны соответствовать интерфейсу cloud.agileframework.security.filter.login.CustomerUserDetailsService. В этом интерфейсе определены необходимые методы для операций с данными учётных записей, такие как создание, обновление, удаление, проверка и загрузка.
Компонент включает встроенную реализацию сохранения данных в памяти, которую можно напрямую использовать, обратившись к следующему исходному коду:
Пользовательский поставщик проверки подлинности должен следовать интерфейсу cloud.agileframework.security.provider.LoginValidateProvider. Компонент будет вызывать поставщика проверки подлинности при возникновении события входа в систему. Компонент включает четыре встроенных поставщика проверки подлинности:
Например, чтобы внедрить проверку полноты формы, необходимо добавить её в контейнер Spring. После этого компонент сможет её распознать:
public class CompleteFormLoginValidateProvider implements LoginValidateProvider {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void validate(HttpServletRequest request, HttpServletResponse response, String username, String password) throws AuthenticationException {
// Проверка полноты формы
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
throw new NoCompleteFormSign();
}
if (logger.isDebugEnabled()) {
logger.debug(String.format("Вход в систему...[учётная запись: %s][пароль: %s]", username, password));
}
}
}
Для настройки шифрования и расшифровки паролей необходимо следовать интерфейсу cloud.agileframework.security.provider.PasswordProvider. Компонент вызовет настраиваемый поставщик шифрования и расшифровки перед проверкой подлинности.
/**
* @author Mydeathtrial
* Описание: Расшифровка пароля, используется для расширения использования передачи зашифрованных данных между клиентом и сервером
* Версия: 1.0
* Дата: 1.0
*/
public interface PasswordProvider {
/**
* Расшифровка
*
* @param ciphertext Зашифрованный текст
* @return Открытый текст
*/
String decrypt(String ciphertext);
}
Обработчик выхода из учётной записи должен следовать интерфейсу cloud.agileframework.security.provider.LogoutProcessorProvider. Компонент активирует эту функцию при выходе из учётной записи. Эта функция может использоваться для различных целей, например, для отключения веб-сокетов, связанных с определённой учётной записью.
/**
* @author Mydeathtrial
* Описание: Обработка после выхода из системы
* Версия: 1.0
* Дата: 1.0
*/
public interface LogoutProcessorProvider {
/**
* После выхода
*
* @param username Учётная запись
* @param token Идентификатор
*/
void after(String username, String token);
}
Настраиваемая обработка результатов аутентификации требует следования интерфейсу cloud.agileframework.security.provider.SecurityResultProvider. Интерфейс содержит три метода обработки результатов:
/**
* @author Mydeathtrial
* Описание: Обработка результатов аутентификации, используется для настройки ответа на успешную аутентификацию/неудачную попытку/выход из системы и т. д.
* Версия: 1.0
* Дата: 1.0
*/
public interface SecurityResultProvider {
/**
* Обработка неудачной попытки аутентификации
*
* @param request Запрос
* @param response Ответ
* @param e Исключение
* @return Ответное представление, по умолчанию исключение будет выброшено, и его обработает централизованный обработчик исключений
* @throws Throwable Исключение
*/
default Object accessException(HttpServletRequest request, HttpServletResponse response, Throwable e) throws Throwable {
throw e;
}
/**
* Успешный вход в систему
*
* @param request Запрос
* @param response Ответ
* @param authentication Данные аутентификации после успешного входа
* @return Представление ответа
*/
default Object loginSuccess(HttpServletRequest request, HttpServletResponse response, UsernamePasswordAuthenticationToken authentication) {
return authentication;
}
/**
* Успешное завершение сеанса
*
* @param request Запрос
* @param response Ответ
* @param username Учётная запись
* @param token Токен
* @return Представление ответа
*/
default Object logoutSuccess(HttpServletRequest request, HttpServletResponse response, String username, String token) {
ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());
modelAndView.addObject("username", username);
modelAndView.addObject("token", token);
return modelAndView;
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )