Ошибка замещения пользователя

  1. Админ дает пользователю 1 права замещать пользователя 2.
  2. Пользователь 1 входит в систему.
  3. Админ запрещает пользователю 1 замещать пользователя 2.
  4. у Пользователя 1 все еще доступен пользователь 2 для замещения через выпадающий список в меню. При попытке замещения выходит ошибка RuntimeException: Substitution error: javax.persistence.NoResultException: User not found

Но после этого сессия пользователя не возвращается к предыдущему состоянию. и появляется экран “Внутренняя ошибка сервера” с ошибкой

java.lang.IllegalStateException: There is no root screen opened
	at com.haulmont.cuba.web.sys.WebScreens.getConfiguredWorkAreaOrNull(WebScreens.java:976) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.WebScreens.getCurrentBreadcrumbs(WebScreens.java:906) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.WebScreens$OpenedScreensImpl.getCurrentBreadcrumbs(WebScreens.java:2080) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.navigation.UrlChangeHandler.getActiveScreen(UrlChangeHandler.java:146) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.navigation.navigationhandler.ParamsNavigationHandler.doHandle(ParamsNavigationHandler.java:50) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.navigation.ScreenNavigator.handleScreenNavigation(ScreenNavigator.java:50) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.AppUI.processRequest(AppUI.java:707) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.AppUI.processExternalLink(AppUI.java:665) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.AppUI.handleRequest(AppUI.java:584) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.vaadin.server.communication.UIInitHandler.reinitUI(UIInitHandler.java:262) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:162) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:67) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1580) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.9.2-26-cuba.jar:8.9.2-26-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.2.14.jar:7.2.14]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.2.14.jar:7.2.14]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[servlet-api.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.38]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.38]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.2.14.jar:7.2.14]

В ChangeSubstUserAction#actionPerform происходит проверка на javax.persistence.NoResultException но в AuthenticationServiceBean#substituteUser при любой Throwable выкидывает RuntimeException. соответственно в ChangeSubstUserAction#actionPerform мы не попадаем на doRevert(). Возможно я где-то ошибся, но проблему я надеюсь вы поняли. Можно это как-то исправить?

Отнаследовались от WebUserIndicator. В new ChangeSubstUserAction(userComboBox.getValue()) переписали actionPerform чтоб тот ловил RuntimeException и в doRevert добавили

val ui = AppUI.getCurrent()
ui.app.createTopLevelWindow()

Ошибку это исправило. Но думаю у вас есть идеи как это получше организовать. Или мб исправить в самой платформе?)

Здравствуйте!

Спасибо, что оповестили о проблеме, был заведен тикет на Github.

С уважением,
Надежда.

Надежда, нашли еще такую проблему.

  1. Админ дает пользователю 1 права замещать пользователя 2.
  2. Пользователь 1 входит в систему.
  3. Админ изменяет срок возможного замещения на будущее.
  4. Пользователь 1 все еще может воспользоваться замещением.

При этом, после успешного замещения. Выпадающий список пользователей для замещения в углу экрана становится не активным. Пользователь1 сидит под Пользователем2 и не может вернуться в свою сессию.

Спасибо за дополнение, добавили данный кейс в тикет.