Статьи

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):

1
2
3
4
5
6
7
<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:

1
2
3
4
5
<?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 .

Ссылка: Создание пользовательских модулей входа в систему В JBoss AS 7 (и ранее) от нашего партнера JCG Якуба Холи в блоге Holy Java .