Java 创建一个Vaadin请求处理程序,在Spring Security获得机会之前处理该请求

Java 创建一个Vaadin请求处理程序,在Spring Security获得机会之前处理该请求,java,spring-boot,spring-security,vaadin,Java,Spring Boot,Spring Security,Vaadin,因此,我们的目标是将应用程序从Thorntail迁移到Spring Boot 一个问题是我们使用Vaadin 8是出于传统原因 该应用程序提供无密码登录支持(如通过链接登录) 现在,vaadin是一个单页框架,因此我们将/login和/passwordless登录选项分离到它们自己的s.t.的vaadin UI中。我们可以配置 override-fun-configure(http:HttpSecurity){ http .csrf().disable() .httpBasic().disabl

因此,我们的目标是将应用程序从Thorntail迁移到Spring Boot

一个问题是我们使用Vaadin 8是出于传统原因

该应用程序提供无密码登录支持(如通过链接登录)

现在,vaadin是一个单页框架,因此我们将
/login
/passwordless
登录选项分离到它们自己的s.t.的vaadin UI中。我们可以配置

override-fun-configure(http:HttpSecurity){
http
.csrf().disable()
.httpBasic().disable()
.formLogin().disable()
.授权请求()
.antMatchers(“/login”).anonymous()
.antMatchers(“/passwordless/**”).permitAll()
.antMatchers(“/vaadinServlet/UIDL/**”).permitAll()
.antMatchers(“/vaadinServlet/HEARTBEAT/**”).permitAll()
.anyRequest().authenticated()
.及()
.logout()
.addLogoutHandler(logoutHandler())
.logoutUrl(“/logout”)
.logoutSuccessUrl(“/login?再见”).permitAll()
.及()
.例外处理()
.authenticationEntryPoint(LoginUrlAuthenticationEntryPoint(“/login”))
}
不幸的是,为了向后兼容,我们必须支持已经分发的旧链接。旧的登录链接设置为

/#!passwordless/<login-token>
/#!无密码/
这意味着,即使我们添加了一个过滤器,我们也无法将请求与任何其他对
/
的请求区分开来

目前,除了允许未经身份验证的请求进入
/
并在用户未经身份验证时手动重定向到登录页面之外,我们看不到其他选项,这非常难看


在Spring security将我们重定向到
/login
之前,我们是否可以定义一个vaadin请求处理程序(它确实可以访问vaadin位置
/#!passwordless/
,因此可以读取
并重定向到
/passwordless/
),因为哈希不包括在HTTP请求中,在发送响应之前,不可能将其放在服务器上

也许您可以配置一个过滤器,截取对
/
的所有请求。如果用户已通过身份验证,则不会执行任何操作。否则,它要么重定向到另一个包含一些JavaScript的页面,要么直接返回一些JavaScript,检查哈希并执行客户端重定向到
/login
/passwordless/

我想这基本上就是你所说的丑陋,但只要过滤器就位,就不应该成为问题

编辑:另一种选择,如果散列被转发到登录页面,您可以在登录页面本身包含一段JavaScript,用于检查散列是否存在并适当重定向