当前位置: 首页 > 知识库问答 >
问题:

Spring security阻止从后台线程导航到另一个视图

周育
2023-03-14

我在从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中的代码。瓦丁。流服务器啊。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个答案

慕容晔
2023-03-14

如果您使用的是VaadinWebSecurityConfigrerAdapterSecurityContext应该会自动在UI线程中可用。不幸的是,ViewAccessChecker不会以任何一种方式利用它。它的实现方式(即以Spring独立的方式)它只需要一个HttpServletRequest。所以我目前没有看到正确的方法来做到这一点(无论如何,使用vanilla Vaadin)。您可能应该在Github上创建一个票证,因为这似乎是一个相当重要的用例。

也许你可以重定向到一个不受保护的视图,需要用户点击一个按钮导航到受保护的视图。页面#setLocation(...)也会为安全检查创建一个新的请求,但这不会在Vaadin内导航,基本上重新创建你的UI。但老实说,这两个选项在可接受的变通方法列表中都很靠后。

如果没有其他人可以提供真正合理的解决方法,您可以查看我的插件:Vaadin的Spring Boot Security。它确实使用Spring的SecurityContext,因此它可以在您的情况下工作。

 类似资料:
  • 您好,我已经使用导航组件和导航图从一个片段导航到另一个片段,我想要的是防止onBack完全按下,这样当用户单击onBack时,应用程序将退出。我正在从注册片段导航到主页片段。 这是导航图中的代码 这是我的代码,当点击注册按钮时,在注册片段中导航

  • 我有两个活动,一个使用导航图,另一个不使用。如何从不使用导航控制器的活动导航到导航图中的片段? 我试图从ImportMonsterActivity(在将新实体添加到db之后)导航到MainActivity导航图中的EditMonsterFragment。 我想我应该能够创建一个正常的意图,并给它一些额外的东西来指定导航图中的位置,但是我没有找到这种导航的任何留档。一切要么使用另一个应用程序的深层链

  • 问题内容: 从第一个视图控制器导航到第二个视图控制器时收到错误消息。我的编码就是这样 问题是我总是收到这种错误消息 问题答案: 我已经找到答案了 斯威夫特4 迅捷3

  • 问题内容: 如何从一个活动屏幕导航到另一个活动屏幕?在第一个屏幕中,我有一个按钮,如果我单击该按钮,则必须移至另一个“活动”屏幕。 问题答案:

  • 问题内容: 我正在使用以下代码以编程方式导航到另一个ViewController。它可以正常工作,但是在某种程度上隐藏了。 我该如何解决? (如果需要的话,可通过将嵌入来创建导航栏。) 问题答案: 斯威夫特5 默认的模式呈现样式是卡片。这在顶部显示了以前的视图控制器,并允许用户滑动显示的视图控制器。 为了保留旧样式,您需要修改视图控制器,如下所示: 对于以编程方式创建和情节提要创建的控制器来说都是

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建