Демонстрационное серверное приложение осуществляющее операцию аутентификацию пользователя.
Взаимодействие клиент/сервер происходит по протоколу WebSocket в определенном формате JSON.
Используются следующие инструменты и технологии:
- EJB
- WildFly Application server
- MySQL database
- сборка с помощью Gradle
- контроль изменений структуры БД с помощью Liquibase
- тестирование с помощью Arquillian
- Hibernate ORM
- Envers для хранения истории токенов пользователей
- Подготовка среды демонстрации
- Установка проекта
- Сборка и развертывание (build and deploy)
- Проверка работоспособности
- Выполнение Arquillian тестов
- История токенов пользователей
- Database DDL
- Полезные материалы
- установить Java SDK
- установить Wildfly (тестирование и отладка производилась на Wildfly v8.2.1.Final)
- установить сервер БД MySQL (дальнейшие настройки соединения с БД предполагают работу сервера локально на порту 3306, 'localhost:3306')
- настроить переменную среды JAVA_HOME
- в папке проекта 'websocket-server' скорректировать значения в файле настроек gradle.properties: секции "Wildlfly config" и "Luqibase config"
- запустить сервер WildFly:
для Linux:
WILDFLY_HOME/bin/standalone.sh -c standalone.xml
для Windows:WILDFLY_HOME\bin\standalone.bat -c standalone.xml
- в папке проекта 'websocket-server' выполнить скрипт конфигурации сервиса:
для Linux:
WILDFLY_HOME/bin/jboss-cli.bat --connect --file=configure-server.cli
для Windows:WILDFLY_HOME\bin\jboss-cli.bat --connect --file=configure-server.cli
- убедиться что сервер БД MySQL запущен
- в папке проекта 'websocket-server' выполнить команду для настройки таблиц БД:
gradlew update
В папке проекта 'websocket-server' выполнить команду:
gradlew deployToWildfly
Зайти в браузере по адресу http://localhost:8080/websocket/ (предполагается, что сервер WildFly запущен с оспользованием web порта 8080)
Если все было выполнено правильно, должна открыться страница вида:
- Успешный сценарий аутентификации пользователя (Для тестов в БД внесен пользователь: email: fpi@bk.ru, password: 123123)
При повторной аутентификации, сервис обновляет время действия существующего, валидного токена. Если токен не валидный (когда его время истекло), создается новый токен.
вводим email "fpi@bk.ru" и password "123213", нажимаем кнопку "login"
- Не успешный сценарий аудентификации пользователя
Можно использовать любые email и password, которых нет в БД
вводим email "123@gmail.com" и password "newPassword", нажимаем кнопку "login"
- Сценарий обработки ошибок
останавливаем БД, нажимаем кнопку "login"
- остановить сервер WildFly, сервер БД MySQL должен быть запущен
- В папке проекта 'websocket-server' выполнить команду:
gradlew testWebsocket
Результаты тестов доступны в папке проекта 'websocket-server/build/reports/tests/index.html'
Хранение истории изменений токенов пользователей происходит в БД, в таблице "ApiToken_AUD". Изменения сохраняются автоматически, с помощью Envers.
CREATE TABLE Customer (
id bigint(20) NOT NULL AUTO_INCREMENT,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX customerEmailIDX (email)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
CREATE TABLE ApiToken (
id bigint(20) NOT NULL AUTO_INCREMENT,
customerId bigint(20) NOT NULL,
token varchar(255) NOT NULL,
expiration datetime NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX apiTokenIDX (token),
CONSTRAINT ApiTokenCustomerFK FOREIGN KEY (customerId)
REFERENCES websocket_demo.customer (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
CREATE TABLE ApiToken_AUD (
REV int(11) DEFAULT NULL,
REVTYPE tinyint(4) DEFAULT NULL,
id bigint(20) DEFAULT NULL,
customerId bigint(20) DEFAULT NULL,
token varchar(255) DEFAULT NULL,
expiration datetime DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
CREATE TABLE REVINFO (
REV int(11) NOT NULL AUTO_INCREMENT,
REVTSTMP bigint(20) DEFAULT NULL,
PRIMARY KEY (REV)
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;
http://www.mastertheboss.com/javaee/websockets/websockets-tutorial-on-wildfly-8?showall=&start=1
http://jlunaquiroga.blogspot.ru/2014/05/websockets-in-jee-7-with-wildfly.html
http://mgreau.com/posts/2013/11/11/javaee7-websocket-angularjs-wildfly.html
https://github.com/mgreau/javaee7-websocket
https://github.com/javaee-samples/javaee7-samples/tree/master/websocket