java - 在 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
解决方案
由于哈希不包含在 HTTP 请求中,因此在发送响应之前不可能将其放在服务器上。
也许您可以配置一个过滤器来拦截所有对/
. 如果用户通过了身份验证,它什么也不做。否则,它要么重定向到另一个包含一些 JavaScript 的页面,要么直接返回一些 JavaScript,它检查哈希并执行客户端重定向到/login
或 to /passwordless/<login-token>
。
我想这基本上就是您所描述的丑陋,但只要该过滤器到位,它就不应该成为问题。
编辑:另一种方法是,如果将哈希转发到登录页面,您可以在登录页面本身包含一段 JavaScript,检查哈希是否存在并适当地重定向。
推荐阅读
- sql-server - 需要根据一个 where 条件排除所有行
- python - 如何使用 2 维列表中的列数据创建新列表
- crossfilter - 使用归约法计算第 n 个百分位数时遇到问题
- javascript - 用于在评论部分呈现星值的 While 循环
- python - Python 文件自行关闭
- javascript - JavaScript 问题跨页面传递值
- webgl - WebGL2 渲染到 R32F 纹理
- python - 如何在稀疏张量上执行 tf.not_equal()?
- r - readJPEG(location) 中的错误:无法打开 D:\kuliah\semester8\dataset
- python - 使用 searchtweets API,twitter api 不断返回 422 错误