Общая аутентификация для нескольких Jmix приложений

Здравствуйте!
У нас есть два приложения на Jmix (модуль с формами и BPM движек). Далее планируется разработка и других модулей в этой же связке.
Вопросы:

  1. Можно ли сделать средствами Jmix единую аутентификацию для всех этих модулей? Т.е. пользователь, аутентифицированный в одном из модулей, далее пользуется и остальными, не проходя аутентификацию.
  2. Можно ли использовать аутентификацию пользователя при отправке рест запросов из модуля форм в BPM движек, чтобы BPM движек понимал полномочия (роль) пользователя инициирующего рест запрос?

Что-то ответа все нет!
Уточню вопрос: как настроить безопасность Jmix, чтобы пользователю приложения Jmix можно было авторизоваться через сервер авторизации, например Keycloak?
Второй вопрос: как настроить в приложении Jmix ресурсный сервер, чтобы можно было ему отправлять рест запросы с токеном, полученным от сервера авторизации, например Keycloak?

Добрый вечер,

Для интеграции с Keycloak можно использовать дополнение OpenID Connect. Настройка дополнения описана в документации.

Установил OpenID Connect.
Приложение Jmix авторизуется через сервер авторизации. Рест запросы от клиента на самописные эндпоинты обрабатываются.
Не получается получить доступ к рест ендпоинтам BPM вида /rest/bpm/process/repository/process-definitions?start=0&size=300, которые должны появиться после установки зависимости implementation ‘io.jmix.bpm:jmix-bpm-rest-starter’
При попытке установить зависимость implementation ‘io.jmix.authserver:jmix-authserver-starter’ приложение перестает запускаться.
Совет из поста Обращение к ендпоинтам flowable - #11 от пользователя danila.daring в данном случае результатов не дал.
Какие нужны настройки, чтобы заработали рест запросы приложения-клиента, авторизованные сервером авторизации, вида /rest/bpm/process/repository/process-definitions?start=0&size=300?

В дополнение к вопросу:
При попытке обратиться к ендпоинту вида /rest/bpm/process/repository/process-definitions?start=0&size=300 переадресует на страницу логина сервера авторизации.
Настройки сервера авторизации и клиента - правильные, иначе не отрабатывались бы рест запросы к самописным ендпоинтам.

Здравствуйте!
Ваш ответ все еще актуален для нас.

Добрый день,

Сразу не смогу подсказать, т.к. у нас сейчас нет проектов, которые одновременно используют jmix 2.x и Keycloak. В jmix 1.5 такая схема вроде работала. Постараюсь сегодня посмотреть.

Насколько я вижу тут возникает та же проблема, что обсуждалась в теме Обращение к ендпоинтам flowable - #9 от пользователя danila.daring. Метод getAuthenticatedUrlPatterns используется в классе AuthorizedApiUrlsConfigurer, а в нем пути для аутентификации API настраиваются без учета servlet path. С ходу не нашел, как можно переопределить этот класс, т.к. он используется через статические методы SecurityConfigurers.

В качестве временного решения можно указать в getAuthenticatedUrlPatterns пути относительно servlet path. Для демонстрации этого варианта я добавил ветку open-id-connect в тестовом проекте jmix-flowable-rest-api. В файле rest_client/jmix.http добавлен тестовый запрос к методу repository/process-definitions, который использует для аутентификации токен keycloak.

Также остается актуальным совет о создании дефекта в проекте Jmix на GitHub:)

Всем добрый день!

Первое, что хочется подчеркнуть: стартер jmix-bpm-rest-starter экспериментальный. Он не был официально зарелизен или анонсирован. Его работоспособность не гарантируется, и в нём возможны изменения.

Есть тикет на доведение его до “production-ready” состояния. Постараемся успеть добраться до данной задачи к июньскому релизу Jmix.

Что касается workaround, который сейчас можно добавить в проект для того, чтобы эндпойнты BPM REST были защищены токеном, выданным Keycloak - должна сработать следующая конфигурация:

@Configuration
public class BpmRestSecurityConfiguration {

    @Bean
    @Order(JmixSecurityFilterChainOrder.OIDC_RESOURCE_SERVER - 10)
    public SecurityFilterChain myBpmRestSecurityFilterChain(HttpSecurity http,
                                                   JmixJwtAuthenticationConverter jmixJwtAuthenticationConverter,
                                                   ApplicationEventPublisher applicationEventPublisher) throws Exception {
        http
                .securityMatcher(new AntPathRequestMatcher("/rest/bpm/**"))
                .oauth2ResourceServer(resourceServer -> {
                    resourceServer.jwt(jwt -> {
                        jwt.jwtAuthenticationConverter(jmixJwtAuthenticationConverter);
                    });
                })
                .cors(Customizer.withDefaults());

        //this filter is required if you want to check whether the user has the "bpm.rest.enabled" specific policy
        OidcResourceServerEventSecurityFilter resourceServerEventSecurityFilter =
                new OidcResourceServerEventSecurityFilter(applicationEventPublisher);
        http.addFilterBefore(resourceServerEventSecurityFilter, AuthorizationFilter.class);
        return http.build();
    }
}

Спасибо! Потестируем.