2

私の Vaadin 14 のメインページはルート Route を持つ MainView です。

MainViewは他のビューの「テンプレート」として使用されるため (with layout = MainView.class)、それ自体で初期化するべきではなく、レイアウトとして他のビューにのみ使用される「抽象」ビューのように見えます。

今の問題: ユーザーがにアクセスするMainViewBeforeEnterEvent、コンストラクターの後に呼び出されます。これは、ユーザーがまだ認証されておらず、コンストラクターがすでにタブの構築などを実行しているため、例外がスローされる可能性があります。

ユーザーが 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

2

Vaadin を使用したスプリング セキュリティのチュートリアル シリーズで説明されているように、コードにセキュリティ上の問題がある可能性があります。代わりにビューを保護する方法が説明されています。VaadinServiceInitListener

しかし、提案された解決策では、ビューに beforeEnterListener も追加されるため、これで問題が解決されるとは思いません。
ユーザーが許可されていない場合、問題の解決策は、MainView のコンストラクターでカスタム例外 (詳細な参照のために NotAuthorizedException と呼びましょう) をスローすることです。次に、 LoginView を実装させますHasErrorParameter<NotAuthorizedException>

于 2020-01-14T10:42:19.660 に答える