Время от времени я просматриваю самый популярный контент в своем блоге и стараюсь максимально удовлетворить ваши потребности. Таким образом, чтение моего блога — это один из способов, с помощью которого мои читатели могут управлять контентом. Другой способ — связаться со мной в комментариях или по электронной почте. На сегодня я собираюсь обновить пример 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
Чтобы использовать постоянные имена пользователей / пароли / роли для аутентификации и авторизации в вашем приложении, в первую очередь вам нужна база данных. И это необходимо развернуть и настроить в 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 «. ».
После того, как вы успешно проверили соединение, включите его. Теперь вы готовы настроить все остальное.
Подготовка базы данных
Прежде чем я углублюсь в настройку домена безопасности, для базы данных нам понадобятся несколько таблиц. Как минимум, они должны содержать логин, пароли и роли. Но модуль входа в базу данных, который я собираюсь использовать здесь, очень гибок и позволяет вам настроить 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.
Настройка веб-приложения
Вы замечаете, что в этом веб-приложении не так много конкретного материала. Он содержит две разные папки в папке веб-страниц, «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> |
Еще более полезной является «функция инкогнито» вашего любимого браузера. Это не позволит вам снова работать с одинаковыми учетными данными, в то время как все, что вы хотели сделать, — это использовать другую учетную запись. Но это также может быть легко решено с помощью выхода из системы. Но это еще одна отличная тема для следующего поста.
Ссылка: | Аутентификация JDBC Realm и Form-based с использованием WildFly 8.2.0.Final, Primefaces 5.1 и MySQL 5 от нашего партнера по JCG Маркуса Эйзела ( Markus Eisele) из блога Enterprise Software Development с Java . |