1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/agile-framework-agile-security

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 08:02 ad83f5b

Компонент agile-security: компонент для аутентификации

Данный компонент был разработан на основе spring-security с большим количеством настроек, что позволяет легко интегрировать его в нашу систему.

При разработке компонента максимально соблюдалась структура spring-security, чтобы избежать ненужного проектирования. В процессе разработки было оставлено много расширяемых интерфейсов для обеспечения максимальной поддержки вторичной разработки. Особенностью компонента является то, что он предоставляет большую поддержку в сценариях разделения передней и задней части, а также использует кэш для хранения информации об учётных записях по умолчанию.

Особенности:

  • JWT + автоматическое продление срока действия токена + принудительное аннулирование: токен генерируется с использованием JWT, и срок действия токена автоматически продлевается и принудительно аннулируется с помощью компонента agile-cache.

  • Настраиваемый способ передачи токенов: встроенная поддержка заголовков (header) и файлов cookie для передачи токенов, которые можно настроить в соответствии с уровнем безопасности конкретного сценария.

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

  • Индивидуальная регистрация учётных записей: здесь доступны три варианта регистрации:

    • Одноэлементный режим (только одна активная учётная запись в системе одновременно).
    • Многоэлементный режим (несколько активных учётных записей в системе одновременно).
    • Режим «точка входа» (для одной учётной записи требуется только один вход в систему, независимо от того, используется ли agile-security в микросервисах или кластерах).
  • Возможность настройки: пакет 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 в контроллере.

Начало работы:

Начало работы с проектом очень просто.

  1. Скачайте пакет: вы можете скачать пакет с последней стабильной версией с GitHub (https://github.com/mydeathtrial/agile-security/releases). Пакет уже загружен в центральный репозиторий Maven, и его можно напрямую объявить в pom.xml.

  2. Добавьте зависимость Maven: объявите центральный репозиторий и зависимость Maven.

  3. Настройте переключатель: настройте переключатель в файле свойств.

  4. Войдите и выйдите: используйте стандартные 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.filter.login.InMemoryUserDetails;
  • Возможность сохранения данных: cloud.agileframework.security.filter.login.InMemoryUserDetailsServiceImpl.

Настройка проверки подлинности

Пользовательский поставщик проверки подлинности должен следовать интерфейсу cloud.agileframework.security.provider.LoginValidateProvider. Компонент будет вызывать поставщика проверки подлинности при возникновении события входа в систему. Компонент включает четыре встроенных поставщика проверки подлинности:

  • Проверка полноты формы (CompleteFormLoginValidateProvider);
  • Ограничение на неудачные попытки входа (ErrorSignLockLoginValidateProvider);
  • Использование капчи (KaptchaLoginValidateProvider);
  • Стратегия входа (LoginStrategyLoginValidateProvider).

Например, чтобы внедрить проверку полноты формы, необходимо добавить её в контейнер 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. Интерфейс содержит три метода обработки результатов:

  • accessException — предоставляет различные типы исключений аутентификации. По умолчанию метод просто выбрасывает исключение, позволяя централизованному обработчику исключений обрабатывать ответ;
  • loginSuccess — обрабатывает успешный вход в систему, возвращая данные аутентификации;
  • logoutSuccess — обрабатывает успешное завершение сеанса, возвращая информацию об учётной записи и токене.
/**
 * @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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/agile-framework-agile-security.git
git@api.gitlife.ru:oschina-mirror/agile-framework-agile-security.git
oschina-mirror
agile-framework-agile-security
agile-framework-agile-security
master