如果用户尚未通过身份验证,如何处理对视图的访问?
How to handle access to Views if the user is not authenticated yet?
我的 Vaadin 14 的主页是一个带有根 Route 的 MainView。
MainView
用作另一个视图(使用 layout = MainView.class
)的 "template",所以我认为它更像是一个不应由 "abstract" 初始化的视图本身并且仅用于其他视图作为布局。
现在的问题是:如果用户访问 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 中发布。
您的代码 可能存在安全问题 ,如 VaadinServiceInitListener
中的 tutorial series for spring security with Vaadin. it is explained how to secure Views 中所述。
但是建议的解决方案还在视图中添加了一个 beforeEnterListener,所以我认为您的问题并没有因此得到解决。
如果用户未获得授权,您的问题的解决方案可能是在 MainView 的构造函数中抛出自定义异常(我们称其为 NotAuthorizedException 以供进一步参考)。然后你让你的 LoginView 实现 HasErrorParameter<NotAuthorizedException>
The issue with instances being created too early 实际上几个小时前就关门了。发布还需要一些时间。
也就是说,不可能在构造函数之前调用实例方法,因此它不能解决您的特定情况。
我建议将您的视图设置代码移动到 onAttach
。如果你只想 运行 设置代码一次,你可以使用 AttachEvent#isInitialAttach
只在第一次附加时执行你的代码。
一旦我上面链接的问题被释放,你可以在构造函数中有代码,但是在调用 beforeEnter
之前仍然会创建具有观察者方法的实例,而不是子视图实例.
要不创建任何视图,您可以在创建 UI 后立即使用 UI#addBeforeEnterListener
将侦听器直接添加到 UI,使用 UI init listener。同样,仅当修复已发布时。
我能够通过额外的身份验证检查临时修复它。它可能不是最好的解决方案,但它现在有效。以后@Tazavoo的回答应该会实现。
public MainView() {
super();
if (!isAuthenticated())
return;
setupView();
}
我的 Vaadin 14 的主页是一个带有根 Route 的 MainView。
MainView
用作另一个视图(使用 layout = MainView.class
)的 "template",所以我认为它更像是一个不应由 "abstract" 初始化的视图本身并且仅用于其他视图作为布局。
现在的问题是:如果用户访问 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 中发布。
您的代码 可能存在安全问题 ,如 VaadinServiceInitListener
中的 tutorial series for spring security with Vaadin. it is explained how to secure Views 中所述。
但是建议的解决方案还在视图中添加了一个 beforeEnterListener,所以我认为您的问题并没有因此得到解决。
如果用户未获得授权,您的问题的解决方案可能是在 MainView 的构造函数中抛出自定义异常(我们称其为 NotAuthorizedException 以供进一步参考)。然后你让你的 LoginView 实现 HasErrorParameter<NotAuthorizedException>
The issue with instances being created too early 实际上几个小时前就关门了。发布还需要一些时间。
也就是说,不可能在构造函数之前调用实例方法,因此它不能解决您的特定情况。
我建议将您的视图设置代码移动到 onAttach
。如果你只想 运行 设置代码一次,你可以使用 AttachEvent#isInitialAttach
只在第一次附加时执行你的代码。
一旦我上面链接的问题被释放,你可以在构造函数中有代码,但是在调用 beforeEnter
之前仍然会创建具有观察者方法的实例,而不是子视图实例.
要不创建任何视图,您可以在创建 UI 后立即使用 UI#addBeforeEnterListener
将侦听器直接添加到 UI,使用 UI init listener。同样,仅当修复已发布时。
我能够通过额外的身份验证检查临时修复它。它可能不是最好的解决方案,但它现在有效。以后@Tazavoo的回答应该会实现。
public MainView() {
super();
if (!isAuthenticated())
return;
setupView();
}