2

我的 Vaadin 14 的主页是带有根 Route 的 MainView。

MainView被用作另一个视图(带有layout = MainView.class)的“模板”,所以我认为它更像是一个“抽象”视图,不应自行初始化,仅用于其他视图作为布局。

MainView现在的问题是:如果用户BeforeEnterEvent在构造函数之后访问。这可能会导致抛出异常,因为用户尚未经过身份验证,并且构造函数已经执行了诸如构建选项卡之类的操作。

有没有办法阻止用户访问 MainView 的路由或在调用构造函数之前执行的事件?仅当用户通过身份验证时才允许访问视图。

@Route("")
public class MainView extends AppLayout implements BeforeEnterObserver {

public MainView() {
    super();

    // Creates all the Tabs that are used in the MainView, may throw exception if the user calls the URL of this View before authenticated
    setupView();
}

...

@Override
public void beforeEnter(BeforeEnterEvent event) {
    // Reroute to Login if User is NOT authenticated
}
}

@Route(value = "foo", layout = MainView.class)
public class OtherView {

更新:

该修复程序作为Vaadin 14.2中的实验性功能发布。

4

3 回答 3

3

过早创建实例的问题实际上在几个小时前就解决了。它需要一些时间才能发布。

话虽这么说,实例方法不可能在构造函数之前被调用,因此它不能解决您的特定情况。

我建议将您的视图设置代码移动到onAttach. 如果您只想运行一次设置代码,您可以使用AttachEvent#isInitialAttach仅在第一次附加时执行您的代码。

一旦我上面链接的问题被释放,你可以在构造函数中拥有代码,但是在调用之前仍然会创建具有观察者方法的实例,而beforeEnter不是子视图实例。

为了不创建任何视图,您可以在创建 UIUI#addBeforeEnterListener后立即使用UI 初始化侦听器将侦听器直接添加到 UI 。同样,仅当修复程序已发布时。

于 2020-01-14T10:58:58.467 回答
2

您的代码可能存在安全问题,如使用 Vaadin 的 spring security 教程系列中所述。而是解释了如何保护视图VaadinServiceInitListener

但是建议的解决方案还在视图中添加了一个 beforeEnterListener,所以我认为您的问题并没有得到解决。
如果用户未获得授权,解决您的问题的方法可能是在 MainView 的构造函数中抛出自定义异常(我们称其为 NotAuthorizedException 以供进一步参考)。然后你让你的 LoginView 实现HasErrorParameter<NotAuthorizedException>

于 2020-01-14T10:42:19.660 回答
0

我能够通过额外的身份验证检查来临时修复它。它可能不是最好的解决方案,但它现在有效。将来应该实施@Tazavoo 的答案。

public MainView() {
    super();
    if (!isAuthenticated()) 
       return;

    setupView();
}
于 2020-01-15T06:33:37.837 回答