Введение
Java Authentication and Authorization Service, или JAAS, произносится как "Джаз", — это Java-реализация стандартного фреймворка информационной безопасности Pluggable Authentication Module (PAM). JAAS был представлен как библиотека расширений для Java Platform, Standard Edition 1.3 и интегрирован в версии 1.4. Основная цель JAAS — разделение задач аутентификации пользователей, чтобы обеспечить возможность их независимого управления. Если предыдущий механизм аутентификации содержал информацию об источнике кода и его подписанте, то JAAS добавляет информацию о том, кто запускает код. Расширяя векторы проверки, JAAS расширяет архитектуру безопасности для Java-приложений, которым требуются модули аутентификации и авторизации.
Модули входа
Модули входа в систему в основном отвечают за аутентификацию, а не за авторизацию, и являются широко используемым компонентом JAAS. Модуль входа в систему должен реализовывать интерфейс javax.security.auth.spi.LoginModule, который определяет следующие методы:
Примечание: Subject – это пользователь, пытающийся войти в систему. initialize: код для инициализации модуля входа в систему, обычно путем сохранения переданных параметров в соответствующие поля класса. login: собственно проверка учетных данных, предоставленных через объект, реализующий интерфейс javax.security.auth.Callback (например, проверка по базе данных). Этот метод может запросить у пользователя логин и пароль или использовать ранее полученные данные. Важно отметить, что если предоставлены неверные учетные данные, необходимо выбросить исключение javax.security.auth.login.FailedLoginException (а не возвращать false, что указывает на игнорирование этого модуля входа в систему и потенциальное успешное завершение аутентификации). commit: идентичность субъекта была подтверждена, поэтому код в этом методе устанавливает Principal и Groups (роли) для успешно аутентифицированного субъекта. Этот метод следует тщательно разрабатывать в корпоративных приложениях, поскольку серверы приложений Java EE часто ожидают, что связи между объектами Principal и Group будут настроены определенным образом. Этот метод должен выбросить исключение javax.security.auth.login.FailedLoginException, если аутентификация не удалась (например, пользователь указал неверный логин или пароль). abort: вызывается, если сам процесс аутентификации завершился неудачей. Если этот метод возвращает false, то данный модуль входа в систему игнорируется. logout: код, который должен быть выполнен при выходе из системы (например, может удалить Principal из Subject или аннулировать веб-сессию). Модули входа в систему могут обеспечивать единый вход (SSO) через определенный протокол/фреймворк SSO (например, SAML, OpenID и SPNEGO), проверять наличие аппаратных токенов безопасности (например, USB-токен) и т.д. В n-уровневом приложении LoginModules могут присутствовать как на стороне клиента, так и на стороне сервера.
LoginModule (javax.security.auth.spi.LoginModule) (модуль для входа в систему)
Модули входа в систему создаются путем реализации этого интерфейса; они содержат код, непосредственно осуществляющий аутентификацию. Для аутентификации учетных данных пользователей могут использоваться различные механизмы. Код может извлекать пароль из базы данных и сравнивать его с паролем, введенным пользователем.
LoginContext (javax.security.auth.login.LoginContext) (продолжение)
Контекст входа в систему — это ядро фреймворка JAAS, которое инициирует процесс аутентификации путем создания объекта Subject. В ходе процесса аутентификации объект Subject наполняется различными принципалами и учетными данными для последующей обработки.
Предмет (javax.security.auth.Subject)
Субъект представляет собой отдельного пользователя, сущность или систему – иными словами, клиента – запрашивающего аутентификацию.
Основная (java.security.Principal)
Принципал представляет собой сущность субъекта. Он заключает в себе характеристики или свойства субъекта. Субъект может содержать несколько принципалов.
Полномочия
Учетные данные – это не что иное, как информация об объекте рассмотрения. Это могут быть номера счетов, пароли, сертификаты и т.д. Поскольку учетные данные представляют собой важную информацию, следующие интерфейсы могут быть полезны для создания корректных и безопасных учетных данных – `javax.security.auth.Destroyable` и `javax.security.auth.Refreshable`. Например, после успешной аутентификации пользователя вы можете заполнить субъект секретным идентификатором (в виде учетных данных), с помощью которого субъект может выполнять критически важные операции, но учетные данные должны быть удалены по истечении определенного времени. В этом случае может потребоваться реализовать интерфейс `Destroyable`. Интерфейс `Refreshable` может быть полезен, если срок действия учетных данных ограничен.