所以我们的目标是将应用程序从Thorntail迁移到Spring Boot。
一个问题是,出于遗留原因,我们正在使用Vaadin 8。
该应用程序提供了无密码的登录支持(如通过链接登录)。
现在vaadin是一个单页面框架,因此我们将/login
和/passwordless
登录选项划分为各自的Vaadin UI。我们可以配置
override fun configure(http: HttpSecurity) {
http
.csrf().disable()
.httpBasic().disable()
.formLogin().disable()
.authorizeRequests()
.antMatchers("/login").anonymous()
.antMatchers("/passwordless/**").permitAll()
.antMatchers("/vaadinServlet/UIDL/**").permitAll()
.antMatchers("/vaadinServlet/HEARTBEAT/**").permitAll()
.anyRequest().authenticated()
.and()
.logout()
.addLogoutHandler(logoutHandler())
.logoutUrl("/logout")
.logoutSuccessUrl("/login?goodbye").permitAll()
.and()
.exceptionHandling()
.authenticationEntryPoint(LoginUrlAuthenticationEntryPoint("/login"))
}
不幸的是,为了向后可移植性,我们必须支持已经分发的旧链接。并将旧的登录链接设置为
/#!passwordless/<login-token>
这意味着即使我们添加了过滤器,我们也无法将请求与对/
的任何其他请求区分开。
当前,除了允许未经身份验证的请求/
并在用户未经身份验证时手动重定向到登录页面外,我们没有其他选择。
我们能否以某种方式定义vaadin请求处理程序(DOES可以访问vaadin位置/#!passwordless/<login-token>
,因此可以读取<login-token>
并重定向到/passwordless/<login-token>
),然后才能安全重定向Spring-security我们去/login
吗?
答案 0 :(得分:0)
由于HTTP请求中不包含哈希,因此无法在发送响应之前将其保存在服务器上。
也许您可以配置一个过滤器来拦截对/
的所有请求。如果用户已通过身份验证,则不执行任何操作。否则,它要么重定向到具有某些JavaScript的另一个页面,要么直接返回一些JavaScript,该JavaScript检查哈希并执行客户端重定向到/login
或/passwordless/<login-token>
。
我猜这基本上就是您所说的丑陋的东西,但是只要有适当的过滤器就不会有问题。
编辑:另一种方法是,如果将哈希转发到登录页面,则可以在登录页面本身上包含一段JavaScript,以检查哈希的存在并适当地重定向。