Статьи

JDBC Realm и аутентификация на основе форм с WildFly 8.2.0.Final, Primefaces 5.1 и MySQL 5

Время от времени я просматриваю самый популярный контент в своем блоге и стараюсь максимально удовлетворить ваши потребности. Таким образом, чтение моего блога — это один из способов, с помощью которого мои читатели могут управлять контентом. Другой способ — связаться со мной в комментариях или по электронной почте. На сегодня я собираюсь обновить пример JDBC Realm с помощью Primefaces и обновить его до последней версии сервера WildFly.

Препараты

Первый шаг — загрузить и распаковать последнюю версию WildFly 8.2.0.Final (я использую Java EE7 Full & Web Distribution) в любое место по вашему выбору. Также убедитесь, что у вас установлен, запущен и работает MySQL Community Server (5.6.22) . Я собираюсь использовать NetBeans 8.0.2, потому что номер версии просто отлично сочетается с WildFly 🙂 И вам также следует загрузить последнюю версию MySQL Connector / J (5.1.34).

Некоторые основы

WildFly 8.x использует комбинацию PicketBox и JAAS в качестве механизма безопасности клиента и сервера WildFly. Конфигурация полностью покрыта так называемой подсистемой безопасности. Подсистема безопасности работает с использованием контекста безопасности, связанного с текущим запросом, этот контекст безопасности затем делает доступным для соответствующего контейнера ряд возможностей из сконфигурированного домена безопасности, предоставляемые возможности — менеджер аутентификации, менеджер авторизации, менеджер аудита и менеджер по картографированию. Более подробную информацию можно найти в документации WildFly . Хорошей новостью является то, что вам не нужно копаться во всех деталях сразу, потому что я сосредоточен на одном элементе конфигурации, который действительно необходим для конкретной конфигурации развертывания. Это домены безопасности . Конфигурирование необходимо выполнить в любом из соответствующих файлов конфигурации сервера (standalone.xml / standalone-full.xml / и т. Д.). По умолчанию настроены домены безопасности «other», «jboss-ejb-policy» и «jboss-web-policy». Обратите внимание, что это абсолютно актуально для ваших приложений, и я собираюсь рассмотреть конфигурацию через минуту. Если вы ищете способ защиты других интерфейсов, вы хотите посмотреть, как защитить интерфейсы управления . У меня есть недавнее сообщение в блоге о том, как настроить ssl / tls с undertow .

Добавить пользователя

Поскольку я собираюсь использовать консоль администратора довольно часто, сначала добавьте пользователя-администратора в область управления. % JBOSS_HOME% / bin / add-user.sh | .bat проведет вас через это.

WildFly и MySQL

deploy_driver

Чтобы использовать постоянные имена пользователей / пароли / роли для аутентификации и авторизации в вашем приложении, в первую очередь вам нужна база данных. И это необходимо развернуть и настроить в WildFly. Существует два способа установить JDBC4-совместимый драйвер: либо разверните его как любой другой пакет приложения, либо установите его как модуль. Любой JDBC 4-совместимый драйвер будет автоматически распознан и установлен в систему по имени и версии. Для несовместимых драйверов, пожалуйста, обратитесь к документации WildFly .

Извлеките файл mysql-connector-java-5.1.34-bin.jar из архива, перейдите в консоль администратора WildFly, выберите «Развертывания» и нажмите кнопку «Добавить». Теперь выберите банку и включите ее на последнем шаге мастера. Теперь переключитесь на «Конфигурация»> «Соединитель»> «Источники данных» и нажмите кнопку «Добавить». Введите имя («UserDS») и имя JNDI («java: jboss / datasources / UserDS». На следующей странице выберите обнаруженный драйвер «mysql-connector-java-5.1.34-bin.jar_com.mysql.jdbc»). .Driver_5_1 «и на последнем шаге вам необходимо настроить URL-адрес подключения, пользователя и пароль для экземпляра. В моем случае имя схемы -» wildfly «, а URL-адрес подключения -» jdbc: mysql: // localhost: 3306 / wildfly «. ».

После того, как вы успешно проверили соединение, включите его. Теперь вы готовы настроить все остальное.

Подготовка базы данных

create_connection

Прежде чем я углублюсь в настройку домена безопасности, для базы данных нам понадобятся несколько таблиц. Как минимум, они должны содержать логин, пароли и роли. Но модуль входа в базу данных, который я собираюсь использовать здесь, очень гибок и позволяет вам настроить SQL-запрос для их возврата. Это означает, что вы можете повторно использовать одну и ту же пользовательскую базу данных приложения, содержащую все виды информации, относящейся к пользователю, и просто указать необходимый SQL-код для модуля входа в систему для возврата правильной информации. В этом примере это будет очень простая установка с двумя таблицами, которые содержат ровно минимальную информацию, необходимую модулю входа в базу данных.

1
2
CREATE TABLE Users(username VARCHAR(255) PRIMARY KEY, passwd VARCHAR(255))
CREATE TABLE UserRoles(username VARCHAR(255), role VARCHAR(32))

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

Предварительное заполнение таблиц хотя бы одним пользователем для проверки предложений является следующим шагом. Чтобы сделать это, нам нужно определиться с алгоритмом MessageDigest , который следует использовать. В Интернете есть много примеров, в которых делается попытка предположить, что MD5 является возможным способом шифрования чего-либо. Это неправда. Должно быть не менее SHA-256 или выше. JDK 8 представил SHA-512, но, похоже, это не работает с этой версией WildFly, поэтому я возвращаюсь к SHA-256. Итак, нам нужен способ зашифровать пароль с помощью SHA-256, прежде чем мы сможем добавить пользователя. К счастью, в PicketBox есть небольшой небольшой инструмент, который вы можете использовать из командной строки:

1
java -cp %JBOSS_HOME%\modules\system\layers\base\org\picketbox\main\picketbox-4.0.21.Final.jar org.jboss.security.Base64Encoder <password> <MessageDigest>

И на выходе получается пароль в кодировке base64. Для пароля «admin» с MessageDigest «SHA-256» это: jGl25bVBBBW96Qi9Te4V37Fnqchz / Eu4qB9vKrRIqRg =

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

1
2
3
INSERT INTO `wildfly`.`user` (`username`, `passwd`) VALUES ('myfear', 'jGl25bVBBBW96Qi9Te4V37Fnqchz/Eu4qB9vKrRIqRg=');
 
INSERT INTO `wildfly`.`userroles` (`unsername`, `role`) VALUES ('myfear', 'ADMIN');

Это был последний шаг за пределы WildFly. Вернитесь к конфигурации сервера и перейдите к примеру приложения.

Настройка домена безопасности в WildFly

Убедитесь, что ваш экземпляр WildFly выключен и откройте конфигурационный xml (например, standalone.xml) для редактирования. Теперь найдите тег <security-domains> и добавьте в него новый домен безопасности:

01
02
03
04
05
06
07
08
09
10
11
 <security-domain name="secureDomain" cache-type="default">
                    <authentication>
                        <login-module code="Database" flag="required">
                            <module-option name="dsJndiName" value="java:jboss/datasources/UserDS"/>
                            <module-option name="principalsQuery" value="select passwd from Users where username=?"/>
                            <module-option name="rolesQuery" value="select role, 'Roles' from UserRoles where username=?"/>
                            <module-option name="hashAlgorithm" value="SHA-256"/>
                            <module-option name="hashEncoding" value="base64"/>
                        </login-module>
                    </authentication>
                </security-domain>

Запустите свой экземпляр и быстро увидите, все ли работает. Перейдите к разделу SimpleJDBCRealmWildFly на моей учетной записи GitHub и откройте его в NetBeans.

Настройка веб-приложения

login_form Вы замечаете, что в этом веб-приложении не так много конкретного материала. Он содержит две разные папки в папке веб-страниц, «admin» и «users». Папка «admin» должна быть защищена, и это делается в файле web.xml путем добавления соответствующего <security-constraint>. <Auth-contraint> — это имя роли «admin». Сравните подробности в web.xml и не забудьте проверить мои предыдущие публикации о том, как все работает подробно, если у вас есть вопросы. Единственное, что остается открытым, это как связать развертывание с доменом безопасности «secureDomain». Это делается в дескрипторе jboss-web.xml.

1
2
3
<jboss-web>
    <security-domain>secureDomain</security-domain>
</jboss-web>

Это все, что нужно для начала магии. Если вы сейчас попытаетесь получить доступ к разделу администрирования примера приложения, вам будет предложено ввести форму для входа.

А как насчет карт ролевых групп?

Это очень простой пример, и я решил не добавлять сопоставление групп ролей. Эта общая концепция фактически позволяет дополнительно абстрагировать роли разработчика от административных / оперативных ролей в производстве. Есть несколько способов сделать это на самом деле. Я добавлю более подробный пост о том, как добавить его в ближайшее время. На данный момент убедитесь, что вы используете один и тот же регистр для элемента <role-name> в файле web.xml и для записи роли базы данных для пользователя. В этом примере оба написаны заглавными буквами: «ADMIN».

Советы по устранению неполадок

Вы столкнетесь с неприятностями. По многим причинам. Кеш один. Если вы измените имя роли в базе данных, вы, скорее всего, не увидите обновления, если вы уже аутентифицировали пользователя. Вы можете удалить атрибут cache-type = ”default” из определения домена безопасности и запустить без кэширования.

Сообщения об ошибках также полезны. Из соображений безопасности в режиме INFO регистрируется не так много. Убедитесь, что вы добавили регистратор безопасности и изменили уровень журнала на TRACE для консольного регистратора в подсистеме журналирования:

1
2
3
 <logger category="org.jboss.security">
                <level name="TRACE"/>
            </logger>

Еще более полезной является «функция инкогнито» вашего любимого браузера. Это не позволит вам снова работать с одинаковыми учетными данными, в то время как все, что вы хотели сделать, — это использовать другую учетную запись. Но это также может быть легко решено с помощью выхода из системы. Но это еще одна отличная тема для следующего поста.