Статьи

Создание пользовательских модулей входа в JBoss AS 7 (и ранее)

JBoss AS 7 аккуратен, но документации все еще не хватает (и сообщения об ошибках не так полезны, как могли бы быть). В этой статье кратко излагается, как вы можете создать свой собственный JavaEE-совместимый модуль входа в систему для аутентификации пользователей вашего веб-приложения, развернутого в JBoss AS. Работает элементарный модуль имени пользователя и пароля.

Зачем использовать стандартную аутентификацию Java EE?

Учебник по безопасности Java EE

Часть спецификации Java EE — это безопасность для веб-приложений и приложений EE, которая позволяет указывать декларативные ограничения в вашем файле web.xml (например, «роль X требуется для доступа к ресурсам по URL-адресам« / protected / * ») и управлять им программно, то есть проверять, что пользователь играет определенную роль (см. HttpServletRequest.isUserInRole ).

Это работает следующим образом:

  1. Вы заявляете в своем web.xml:

    1. Конфигурация входа в систему — прежде всего, использовать ли приглашение браузера (базовое) или пользовательскую форму входа и имя для области входа в систему

      • Пользовательская форма использует «волшебные» значения для действия post и полей, начинающихся с j_, которые перехватываются и обрабатываются сервером
    2. Роли, используемые в вашем приложении (обычно вам нужно что-то вроде «пользователь» и, возможно, «админ»)
    3. Какие роли необходимы для доступа к определенным шаблонам URL (по умолчанию: нет)
    4. Требуется ли HTTPS для некоторых частей приложения
  2. Вы сообщаете серверу приложений, как аутентифицировать пользователей для этой области входа в систему, обычно связывая его имя с одним из доступных в конфигурации модулей входа в систему (модули от простого списка пользователей на основе файлов до поддержки LDAP и Kerberos). Лишь в редких случаях вам нужно создать собственный модуль входа в систему, тема этого поста.

Если это для вас новинка, я настоятельно рекомендую прочитать Учебное пособие по Java EE 5 — Примеры: защита веб-приложений (аутентификация на основе форм с помощью страницы JSP, включая спецификацию ограничений безопасности, базовая аутентификация с JAX-WS, защита корпоративного компонента, использование Методы isCallerInRole и getCallerPrincipal).

Зачем беспокоиться?

  • Декларативная безопасность отделена от бизнес-кода
  • Информацию о безопасности легко распространять между веб-приложением и, например, EJB-компонентами (где вы можете декларативно защитить полный компонент или определенный метод через xml или с помощью аннотаций, таких как @RolesAllowed )
  • Легко переключиться на другой механизм аутентификации, такой как LDAP, и более вероятно, что SSO будет поддерживаться

Пользовательские параметры реализации модуля входа

Если вам не подходит один из модулей входа в систему (часть домена безопасности), поставляемый из коробки с JBoss, например UsersRoles, Ldap, Database, Certificate, тогда вы можете настроить один из них или реализовать свой собственный. Ты сможешь:

  1. Расширьте один из конкретных модулей, переопределив один или несколько его методов, чтобы приспособиться к вашим потребностям — см. F.ex. как переопределить DatabaseServerLoginModule, чтобы указать собственное шифрование хранимых паролей. Это должно быть вашим основным выбором, возможно.
  2. Имя подклассаPasswordLoginModule
  3. Реализуйте javax.security.auth.spi.LoginModule, если вам нужна максимальная гибкость и переносимость (это часть Java EE, а именно JAAS , и довольно сложная)

JBoss EAP 5 Руководство по безопасности Ch. 12.2. Пользовательские модули имеют отличное описание базовых модулей (AbstractServerLoginModule, UsernamePasswordLoginModule) и того, как действовать при их наследовании или любом другом стандартном модуле, включая описание ключевых методов для реализации / переопределения. Вы должны прочитать это. (Руководство по-прежнему в полной мере применимо к JBoss AS 7 в этом отношении.) Также стоит прочитать пример пользовательского модуля JndiUserAndPass , расширяющего UsernamePasswordLoginModule — он использует параметры модуля и поиск JNDI.

Пример: пользовательский подкласс UsernamePasswordLoginModule

См. Исходный код MySimpleUsernamePasswordLoginModule , расширяющий JBoss ‘ UsernamePasswordLoginModule .

Абстрактный UsernamePasswordLoginModule ( исходный код ) работает путем сравнения пароля, предоставленного пользователем на равенство, с паролем, возвращенным из метода getUsersPassword, реализованного подклассом. Вы можете использовать метод getUsername для получения имени пользователя, пытающегося войти в систему.

Реализуйте абстрактные методы

getUsersPassword ()

Реализуйте getUsersPassword () для поиска пароля пользователя, где бы он ни был. Если вы не храните пароли в виде простого текста, прочитайте, как настроить поведение с помощью других методов ниже

getRoleSets ()

Реализуйте getRoleSets () (из AbstractServerLoginModule), чтобы вернуть хотя бы одну группу с именем «Roles» и содержащую 0+ ролей, назначенных пользователю, см. Реализацию в исходном коде для этого поста . Обычно вы бы где-нибудь искали роли для пользователя (вместо того, чтобы возвращать жестко закодированную роль «user_role»).

При желании можно расширить инициализацию (..), чтобы получить доступ к параметрам модуля и т. Д.

Обычно вы также хотите расширить инициализацию (тема субъекта, CallbackHandler callbackHandler, карта sharedState, параметры карты) ( вызывается для каждой попытки аутентификации),

При желании переопределите другие методы, чтобы настроить поведение

Если вы не храните пароли в виде простого текста (мудрый выбор!) И ваш метод хеширования не поддерживается сразу после установки, тогда вы можете переопределить createPasswordHash (String username, String password, String digestOption), чтобы хэшировать / шифровать предоставленные пользователем пароль перед сравнением с сохраненным паролем.

В качестве альтернативы вы можете переопределить validatePassword (String inputPassword, String Ожидаемый пароль ), чтобы выполнить любое преобразование пароля перед сравнением или даже выполнить сравнение другого типа, чем равенство.

Пользовательские параметры развертывания модуля входа

В JBoss AS вы можете

  1. Разверните свой класс модуля входа в JAR как автономный модуль, независимо от веб-приложения, в <JBoss AS 7> / modules / вместе с module.xml — описанным в JBossAS7SecurityCustomLoginModules.
  2. Разверните свой класс модуля входа в систему как часть вашего веб-приложения (не требуется module.xml)

    1.  В банке внутри WEB-INF / lib /
    2. Прямо под WEB-INF / классами

В каждом случае вы должны объявить соответствующий домен безопасности внутри конфигурации JBoss (standalone / configuration / standalone.xml или domain / configuration / domain.xml):

<security-domain name="form-auth" cache-type="default">
  <authentication>
    <login-module code="custom.MySimpleUsernamePasswordLoginModule" flag="required">
      <!--module-option name="exampleProperty" value="exampleValue"/-->
    </login-module>
  </authentication>
</security-domain>

Код атрибута должен содержать полное имя вашего логина класса модуля и Охранно-домена имя должно соответствовать заявление в JBoss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
  <security-domain>form-auth</security-domain>
  <disable-audit>true</disable-audit>
</jboss-web>

Код

Загрузите веб-приложение jboss-custom-login, содержащее пользовательский модуль входа MySimpleUsernamePasswordLoginModule , следуйте инструкциям по развертыванию в README .