Добрый день.
jmix: 2.3.2
plugin: 2.3.2-241
idea: IntelliJ IDEA 2024.1.4 (Community Edition)
В cuba-platform был интерфейс NavigationHandler.
С его помощью был реализован следующий сценарий:
- В приложении был реализован бин кастомной авторизации, который по некоему ключу (далее тикет) находил сессию пользователя и выставлял ее в контекст безопасности:
public void authorize(UUID ticket) {
if (Objects.isNull(ticket)) {
throw new RuntimeException("No ticket");
}
//если есть текущая сессия
Connection connection = App.getInstance().getConnection();
UserSession userSession = connection.getSession();
if (Objects.isNull(userSession)) {
throw new RuntimeException("No session");
}
//если текущая сессия соответствует сессии пользователя получившего тикет - выходим
if (ticketService.check(ticket
, userSession.getId())) {
return;
}
//системные сессии ругаются если их попытаться выйти
if (!userSession.isSystem()) {
connection.logout();
}
Credentials credentials = new AnonymousUserCredentials(locale);
//тикет не для анонимного пользователя
if (!ticketService.isForAnonymous(ticket)) {
credentials = new ExternalUserCredentials(cgiswsTicketService.getLogin(ticket)
, new Locale("ru"));
}
connection.login(credentials);
ticketService.setWebClientUserSessionId(ticket, connection.getSession().getId());
}
- В приложении был реализован бин имплементирующий интерфейс NavigationHandler:
@Component(NavigationHandlerBean.NAME)
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Order(NavigationHandler.LOWEST_PLATFORM_PRECEDENCE - 50)
public class NavigationHandlerBean implements NavigationHandler {
public static final String NAME = "app_NavigationHandlerBean";
protected static final String PARAM_TICKET = "ticket";
@Inject
protected GlobalConfig globalConfig;
@Inject
private CustomAuthorizationBean authorizationBean;
@Override
public boolean doHandle(NavigationState requestedState, AppUI ui) {
//получаем значение параметра тикета
String ticketValue = requestedState.getParams().getOrDefault(PARAM_TICKET, null);
if (Objects.isNull(ticketValue)) {
return false;
}
//получаем тикет
UUID ticket = null;
try {
ticket = UuidProvider.fromString(ticketValue);
} catch (Exception e) {
logger.error("Bad ticket");
}
authorizationBean.authorize(ticket);
return false;
}
}
- Пользователь стороннего клиента будучи авторизованным (bearer) в приложении через REST получал тикет;
- Тикет передавался по ссылке к экрану приложения (клиент открывал экран в iframe на своей стороне) в параметрах запроса (пример: http://localhost:8080/app/somescreen?ticket=тикет);
- Бин имплементирующий интерфейс NavigationHandler при выполнении метода doHandle выполнял метод login для соединения;
- Далее требуемый экран открывался уже авторизированным в сессии связанного с тикетом пользователя (соответственно со всеми настройками безопасности данного пользователя).
Есть ли в jmix механизмы позволяющие повторить этот сценарий?
Спасибо.
С уважением, Алексей.