URL Vaadin LoginOverlay 中的参数

URL Parameters in Vaadin LoginOverlay

我已经使用 Vaadin App Starter 创建了一个 Vaadin 21 项目。该应用程序使用身份验证,因此用户首先必须登录 LoginView:

@PageTitle("Login")
@Route(value = "login")
public class LoginView extends LoginOverlay implements BeforeEnterListener {
    public LoginView() {
        setAction("login");

        LoginI18n i18n = LoginI18n.createDefault();
        i18n.setHeader(new LoginI18n.Header());
        i18n.getHeader().setTitle("My App");
        i18n.getHeader().setDescription("Login using user/user or admin/admin");
        i18n.setAdditionalInformation(null);
        setI18n(i18n);

        setForgotPasswordButtonVisible(false);
        setOpened(true);
    }

    @Override
    public void beforeEnter(BeforeEnterEvent beforeEnterEvent) {
        Map<String,List<String>> parametersMap = beforeEnterEvent.getLocation().getQueryParameters().getParameters();

        if (parametersMap.contains("myid")) {
            // Do something
        }
    }
}

我想在URL参数中传递一个id来自定义LoginView,所以我添加了beforeEnter方法来获取URL参数。但是,如果我使用 URL http://localhost:8080/login?myid=5 在浏览器中打开我的应用程序,则会调用 beforeEnter 方法,但没有 URL parametersMap中的参数,为空。如何在 LoginOverlay 视图中传输 URL 参数?

如果你添加

logging.level.org.springframework.security=DEBUG

您的 src/main/resources/application.properties 您会看到 Spring 安全性是阻止您的 URL 参数到达登录视图的安全性:

2021-09-14 14:01:21.194 DEBUG 24566 --- [io-23342-exec-1] o.s.s.w.a.i.FilterSecurityInterceptor    : Failed to authorize filter invocation [GET /login?myid=5] with attributes [authenticated]
2021-09-14 14:01:21.195 DEBUG 24566 --- [io-23342-exec-1] o.s.s.web.DefaultRedirectStrategy        : Redirecting to http://localhost:23342/login

您可以通过将 Spring 安全配置方法更改为例如

来允许此操作
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().regexMatchers("/login\?myid=.*").permitAll();
        super.configure(http);
        setLoginView(http, LoginView.class, LOGOUT_URL);
    }

现在您还需要解决代码中的一个小问题,即您必须在 beforeEnter 的 class 视图中实现 BeforeEnterObserver 而不是 BeforeEnterListener被调用。