Как быстро сделать прототип личного кабинета пользователя на 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: Dev-UI

Безопасность реализована.

Анализ трудоемкости, если бы не использовался 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: Dev-UI

Все вместе и магия 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: Dev-UI

А теперь немного про магию Quarkus

Не останавливая приложение, я поменял шаблон и ItemResource, чтобы выводился владелец списка Items: Template-edits

User

ItemResource

После обновления страницы изменения появились сразу: ItemResource

Итого, получился простейший личный кабинет с безопасностью на базе OpenID Connect.

Анализ трудоемкости, если бы не использовался quickstart:

  • добавить зависимость quarkus-resteasy-qute
  • реализовать html шаблон на qute
  • реализовать ItemResource

Из трудоемкости вычитаем необходимость перезагружать приложение, чтобы увидеть изменения, все делает quarkus:dev