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
被调用。
我已经使用 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
被调用。