创建一个Vaadin请求处理程序以在Spring Security得到机会之前处理请求

时间:2019-05-22 15:12:49

标签: java spring-boot spring-security vaadin

所以我们的目标是将应用程序从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吗?

1 个答案:

答案 0 :(得分:0)

由于HTTP请求中不包含哈希,因此无法在发送响应之前将其保存在服务器上。

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

我猜这基本上就是您所说的丑陋的东西,但是只要有适当的过滤器就不会有问题。

编辑:另一种方法是,如果将哈希转发到登录页面,则可以在登录页面本身上包含一段JavaScript,以检查哈希的存在并适当地重定向。

相关问题