Безопасность Spring предотвращает переход к другому представлению из фонового потока

У меня проблемы с миграцией с Vaadin 14 на Vaadin 23. У меня есть длительная фоновая задача с диалоговым окном прогресса. С Vaadin 14 после завершения задачи я мог перейти к представлению результатов со следующим кодом:

      UI ui = UI.getCurrent();
final SecurityContext context = SecurityContextHolder.getContext();

ui.access(() -> {
  SecurityContextHolder.setContext(context);
  UI.navigate("work-finished-view");
});

С Vaadin 23 я получаю это предупреждение

      (ViewAccessChecker.java:147) Preventing navigation to com.vaadin.flow.router.RouteNotFoundError because no HTTP request is available for checking access.

Это код в com.vaadin.flow.server.auth.ViewAccessChecker

      VaadinServletRequest vaadinServletRequest = VaadinServletRequest.getCurrent();
if (vaadinServletRequest == null) {
  // This is in a background thread and we cannot access the request
  // to check access
  getLogger().warn("Preventing navigation to " + targetView.getName()
                  + " because no HTTP request is available for checking access.");
  beforeEnterEvent.rerouteToError(NotFoundException.class);
  return;
}

Как правильно перейти к другому представлению из фонового потока?

1 ответ

Вам нужно будет создать поддельный запрос, который использует значения из держателя контекста безопасности, и установить этот запрос, используя CurrentInstance.set(VaadinRequest.class, request);. Вполне выполнимо, но не очень красиво.

Вместо того, чтобы писать здесь длинный и хакерский пример того, как это можно сделать, я потратил время на создание запроса на включение, чтобы в будущем это работало из коробки: https://github.com/vaadin/flow/pull/13675

Другие вопросы по тегам