Обращение к ендпоинтам flowable

Здравствуйте!
Мы подняли приложение jmix и подключили модуль BPM. Задача заключалась в том, чтобы сделать на основе встроенного BPM jmix оркестаратор для других сервисов.

Встроенных jmix ендпоинтов для взаимодействия с BPM мы найти не смогли, и возникла потребность обращаться непосредственно к ендпоинтам flowable для взаимодействия с BPM движком.

Была добавлена в приложение зависимость
flowable-spring-boot-starter-rest:7.0.0

После этого в браузере, аутентифицированном под jmix, получилось получить корректные ответы на гет запросы к flowable:

image

При отправке рест запросов к ендпоинтам flowable получили ответ 401. Был написан механизм получения аутентификационного токена и отправки рест запросов с этим токеном.

В результате при отправке рест запросов к эндпоинтам jmix получаем корректный ответ. Например:
GET http://localhost:8686/rest/docs/openapi.json

image

Но когда отправляешь рест запрос к ендпоинтам flowable, то в ответ приходит html такого вида:

image

Как настроить jmix так, чтобы получать валидный json на запросы к ендпоинтам flowable?

Вот такая штука тоже у нас не работает:
vaadin.exclude-urls=/rest/**
http://localhost:8080/rest/bpm/process/repository/process-definitions

Добрый день,

А какая у вас версия jmix? Возможно нужно добавить параметр jmix.rest.authenticated-url-patterns в application.properties:

jmix.rest.authenticated-url-patterns=/process-api/**

Также есть библиотека jmix-bpm-rest-starter, которая включает Flowable REST API. Для подключения нужно добавить зависимость:

implementation 'io.jmix.bpm:jmix-bpm-rest-starter'

Нужно учитывать, что в jmix-bpm-rest-starter изменен путь к flowable endpoints:

flowable.process.servlet.path=/rest/bpm/process
flowable.dmn.servlet.path=/rest/bpm/dmn

Версия jmix - 2.1.3

Установил зависимость jmix-bpm-rest-starter

Теперь в браузере после аутентификации можно запросить гет запрос к BPM:
image

При запросе того же URL через rest запрос с токеном аутентификации по прежнему вместо JSON получаем html страницу (скорее всего страницу login).

МОжет быть что-то не так с зависимостями или настройками:

dependencies {
implementation ‘io.jmix.core:jmix-core-starter’
implementation ‘io.jmix.data:jmix-eclipselink-starter’
implementation ‘io.jmix.security:jmix-security-starter’
implementation ‘io.jmix.security:jmix-security-flowui-starter’
implementation ‘io.jmix.security:jmix-security-data-starter’
implementation ‘io.jmix.localfs:jmix-localfs-starter’
implementation ‘io.jmix.flowui:jmix-flowui-starter’
implementation ‘io.jmix.flowui:jmix-flowui-data-starter’
implementation ‘io.jmix.flowui:jmix-flowui-themes’
implementation ‘io.jmix.datatools:jmix-datatools-starter’
implementation ‘io.jmix.datatools:jmix-datatools-flowui-starter’

implementation 'io.jmix.flowui:jmix-flowui-kit'

implementation 'org.springframework.boot:spring-boot-starter-web'

runtimeOnly 'org.hsqldb:hsqldb'

implementation 'io.jmix.bpm:jmix-bpm-starter'
implementation 'io.jmix.bpm:jmix-bpm-flowui-starter'

// my adds
implementation ‘io.jmix.rest:jmix-rest-starter’
implementation ‘io.jmix.authserver:jmix-authserver-starter’

implementation 'io.jmix.bpm:jmix-bpm-rest-starter'    

testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'io.jmix.flowui:jmix-flowui-test-assist'

}

main.datasource.url = jdbc:hsqldb:file:.jmix/hsqldb/rnrcbpmengine
main.datasource.username = sa
main.datasource.password =

main.liquibase.change-log=com/company/rnrcbpmengine/liquibase/changelog.xml

jmix.ui.login-view-id = LoginView
jmix.ui.main-view-id = MainView
jmix.ui.menu-config = com/company/rnrcbpmengine/menu.xml
jmix.ui.composite-menu = true

ui.login.defaultUsername = admin
ui.login.defaultPassword = admin

jmix.core.available-locales = en,ru_RU

Launch the default browser when starting the application in development mode

vaadin.launch-browser = true

Use pnpm to speed up project initialization and save disk space

vaadin.pnpm.enable = true

logging.level.org.atmosphere = warn

‘debug’ level logs SQL generated by EclipseLink ORM

logging.level.eclipselink.logging.sql = info

‘debug’ level logs data store operations

logging.level.io.jmix.core.datastore = info

‘debug’ level logs access control constraints

logging.level.io.jmix.core.AccessLogger = debug

‘debug’ level logs all Jmix debug output

logging.level.io.jmix = debug
server.port=8686

#my_adds

consider disabling anonymous access to the docs in production environment by removing this property

#jmix.rest.anonymous-url-patterns = /rest/**
vaadin.exclude-urls=/rest/**
jmix.rest.authenticated-url-patterns=/rest/**
flowable.process.servlet.path=/rest/bpm/process

spring.security.oauth2.authorizationserver.client.myclient.registration.client-id=otfxlsfzpp
spring.security.oauth2.authorizationserver.client.myclient.registration.client-secret={noop}ancqRrjGLF
spring.security.oauth2.authorizationserver.client.myclient.registration.authorization-grant-types=client_credentials
spring.security.oauth2.authorizationserver.client.myclient.registration.client-authentication_methods=client_secret_basic
spring.security.oauth2.authorizationserver.client.myclient.token.access-token-format=reference

jmix.authserver.client.myclient.client-id = otfxlsfzpp
jmix.authserver.client.myclient.resource-roles = system-full-access

А вы можете сделать и прислать тестовый проект, в котором воспроизводится проблема? По конфигурации сложно поменять, в чем может быть причина проблемы.

Теперь в браузере после аутентификации можно запросить гет запрос к BPM:
При запросе того же URL через rest запрос с токеном аутентификации по прежнему вместо JSON получаем html страницу (скорее всего страницу login).

Cтранно, что вы браузере запрос работает, возможно проблема на стороне клиента. Можно попробовать проверить запросы с помощью какго-нибудь стандартного клиента (например, через curl, Postman или IDEA Http Client).

Эндпоинты BPM движка заработали только после того, как сделал такие настройки:

jmix.rest.anonymous-url-patterns=**
jmix.authserver.client.myclient.resource-roles=rest-minimal,system-full-access

По-другому никак не работало.
Можно ли сделать как-то более изящно?
При такой конфигурации получается, что открыты все ресты для анонимов.
Как сделать ресурсную роль, которая бы давала права только на управление, BPM движком?
У rest-minimal не хватает полномочий для BPM, а у system-full-access слишком много.

По-другому никак не работало. Можно ли сделать как-то более изящно?

У нас в проектах Flowable REST API корректно работает с аутентификацией.

Как сделать ресурсную роль, которая бы давала права только на управление, BPM движком?

В библиотеке jmix-bpm-rest есть готовая роль BpmRestRole.

Что сделать, чтобы у нас заработало?

Когда включил jmix.rest.anonymous-url-patterns=** ресты заработали, но сломался моделер:

image

Можете скинуть болванку, где работает моделер и рест апи BPM движка?

Можете скинуть болванку, где работает моделер и рест апи BPM движка?

Можно такую болванку сделать, но не уверен, что сегодня успею. Думаю если вы пришлете ваш тестовый проект, где не работает доступ, получится быстрее разобраться с проблемой.

Вот здесь тестовый проект:

Я тоже сделал тестовый проект:) В процессе обнаружил, что доступ действительно не работает в конфигурации по умолчанию, нужны дополнительные настройки security. Там проблема в том, что пути для аутентификации API настраиваются без учета servlet path (класс AuthorizedApiUrlsConfigurer), а контроллеры Flowable регистрируются через отдельные dispatcher servlets (класс RestApiAutoConfiguration). Думаю можно создать дефект в проекте Jmix на GitHub.

Тестовый проект выложен на GitHub - GitHub - daring2/jmix-flowable-rest-api, дополнительная настройка spring security выполняется в классе BpmRestConfigurer. В файле rest_client/jmix.http сохранены тестовые запросы к Jmix и Flowable REST API для IDEA Http Client. Первый запрос получает и сохраняет access_token.