首页 > 解决方案 > 在 Spring Security 有机会之前创建一个处理请求的 Vaadin 请求处理程序

问题描述

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

一个问题是我们出于遗留原因使用 Vaadin 8。

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

现在 vaadin 是一个单页框架,所以我们已经将登录/login/passwordless登录选项拆分为他们自己的 st 我们可以配置的 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>

这意味着即使我们添加一个过滤器,我们也无法将请求与任何其他请求区分开来/

目前,如果用户未通过身份验证,除了允许未经身份验证的请求并手动重定向到登录页面外,我们没有其他选择/,这非常难看。

我们可以在 Spring-security 将我们重定向到之前以某种方式定义一个 vaadin 请求处理程序(它可以访问 vaadin 位置/#!passwordless/<login-token>,因此可以读取<login-token>并重定向到)吗?/passwordless/<login-token>/login

标签: javaspring-bootspring-securityvaadin

解决方案


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

也许您可以配置一个过滤器来拦截所有对/. 如果用户通过了身份验证,它什么也不做。否则,它要么重定向到另一个包含一些 JavaScript 的页面,要么直接返回一些 JavaScript,它检查哈希并执行客户端重定向到/login或 to /passwordless/<login-token>

我想这基本上就是您所描述的丑陋,但只要该过滤器到位,它就不应该成为问题。

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


推荐阅读