Как быстро сделать прототип личного кабинета пользователя на quarkus и keycloak с live reload.
Мотивация
Продолжаю эксперименты с Quarkus. Решил попробовать написать простейший личный кабинет:
- пользователь логинится
- пользователь видит свои Items
Для реализации безопасности планировал использовать Keycloak, и как оказалось, экосистема Quarkus все предлагает из коробки (в режиме разработки даже поднимает за нас сервер keycloak).
Результат доступен в репозитории: https://github.com/achernetsov/quarkus-cabinet-starter
Пререквизиты
- Docker
Реализация
За основу взял quickstart примеры из https://github.com/quarkusio/quarkus-quickstarts
Security
На базе security-openid-connect-web-authentication-quickstart
В данном примере реализуется безопасность приложения через OpenID Connect и Keycloak. Ничего дополнительно настраивать не надо (только проследить чтобы Docker service был запущен).
Выполнить команду:
./mvnw clean compile quarkus:dev
Quarkus в режиме dev сам запустит Keycloak в контейнере и создаст keycloak realm из файла quarkus-realm.json, в котором настроены пользователи и роли.
Quarkus также запустит dev-ui (localhost:8080/q/dev), там можно посмотреть детали приложения, и есть ссылка на keycloak: Залогиниться надо под alice / alice:
Безопасность реализована.
Анализ трудоемкости, если бы не использовался quickstart пример:
- инициировать quarkus приложение с зависимостями quarkus-oidc quarkus-resteasy-jackson (тривиально)
- настроить keycloak realm и application.properties - основные трудозатраты.
Кабинет пользователя
На базе qute-quickstart
Qute - template framework для реализации server side rendering веб-приложений.
Чтобы посмотреть как работает, выполнить команду ./mvnw clean compile quarkus:dev
:
Зайти на страницу localhost:8080/items, отобразится список Items, которые раздает ItemResource:
Все вместе и магия quarkus
Кабинет инициировал из примера security-openid-connect-web-authentication-quickstart.
Далее добавил зависимость:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-qute</artifactId>
</dependency>
Скопировал ItemsResource и items.html шаблон из qute-quickstart
Запустил приложение через ./mvnw clean quarkus:dev
,
Открыл localhost:8080/items
(отправило логиниться), залогинился под alice/alice.
Увидел список Items, которые отдает ItemsResource:
А теперь немного про магию Quarkus
Не останавливая приложение, я поменял шаблон и ItemResource, чтобы выводился владелец списка Items:
После обновления страницы изменения появились сразу:
Итого, получился простейший личный кабинет с безопасностью на базе OpenID Connect.
Анализ трудоемкости, если бы не использовался quickstart:
- добавить зависимость quarkus-resteasy-qute
- реализовать html шаблон на qute
- реализовать ItemResource
Из трудоемкости вычитаем необходимость перезагружать приложение, чтобы увидеть изменения, все делает quarkus:dev