JavaFX Webview & Azure auth & Spring Mystic

问题描述 投票:0回答:1

我遇到了一个有趣的故事,我在

Spring Boot
3.1.5
上有一个 Web 服务,我给它附加了
Azure ldap
身份验证,服务器本身在架构中扮演着“大脑”的角色, 以视图的形式,我在
javafx
+
spring
上创建一个桌面,从桌面到服务器我经历通常的
RestTemplate
(我不添加任何额外的标题),然后是一个有趣的情况,当在
javafx webview
我登录到服务器(服务器有默认视图)时,然后,奇迹般地,我还可以使用
RestTemplate
向服务器发出 get 请求(尽管理论上请求不应该通过,因为我绝对没有发送任何标头;在调试中,
Spring
也没有发送任何cookie,即请求应该由于未经授权而失败。

我登录的这个

webview
并没有体现任何业务逻辑,即这不是一个授权面板,我是为了测试而玩的,发现了一个这么有趣的笑话。

我做了什么来找出问题:

我使用了

wireshark
,这表明确实有人在我的请求中扔了cookie。

我检查了

HttpURLConnection.setDefaultRequestProperty()
的调用,没有人调用这个方法。

在另一个线程中向服务器发出请求,结果请求成功,并且还添加了一个 header。

我在调试中也没有看到任何标头,让我再次提醒您,我没有在请求中放置任何标头。

我发送请求的代码,它的简单请求:

return restTemplate.getForEntity(path, response).getBody();

和简单的

restTemplate
配置:

@Bean
  public RestTemplate restTemplate(AdminHost adminHost) {
    return new RestTemplate();
  }

Query
授权前(数据来自
wireShark
):

GET /consumer/all HTTP/1.1
Accept: application/json, application/*+json
User-Agent: Java/17.0.6
Host: localhost:8585
Connection: keep-alive

Query
授权后:

   GET /consumer/all HTTP/1.1
   Accept: application/json, application/*+json
   User-Agent: Java/17.0.6
   Host: localhost:8585
   Connection: keep-alive
   Cookie: JSESSIONID=F90C8BCEADE10470F641D2E5138A1034

还有另一个让我震惊的事实,

如果我使用之前的配置,那么就会发生我上面描述的情况,但是如果我按如下方式更改配置,即我简单地在特定主机上配置

restTemplate
,那么一切都会发生变化,会话仍然被扔进标头,但此会话要么已损坏,要么不活动,因为请求未通过。

这里配置:

@Bean
  public RestTemplate restTemplate(AdminHost adminHost) {
    return new RestTemplateBuilder().rootUri(adminHost.getHost()).build();
  }

这里是请求之间的区别。

新配置请求失败:

GET /consumer/all HTTP/1.1
Accept: application/json, application/*+json
Accept-Encoding: gzip, x-gzip, deflate
Host: localhost:8585
Connection: keep-alive
User-Agent: Apache-HttpClient/5.2.3 (Java/17.0.6)
Cookie:JSESSIONID=A568E0B7A760E211F275DBBE6CE67BDF

使用旧配置的成功请求:

GET /consumer/all HTTP/1.1
   Accept: application/json, application/*+json
   User-Agent: Java/17.0.6
   Host: localhost:8585
   Connection: keep-alive
   Cookie: JSESSIONID=F90C8BCEADE10470F641D2E5138A1034

cookies
插入到任何请求中,我通过
RestTemplate
Apache
甚至本机
Java
工具发出请求,最终在其中任何一个中插入会话,

所以,有几个问题:

  1. 在 webview 中授权后,为什么、如何以及从哪里将 cookie 插入到我的请求中,这与我的手动请求无关
  2. 为什么将restTemplate的配置更改为特定主机后,一切都出错了,请求开始失败?
  3. 发生了什么事...
java spring spring-boot javafx
1个回答
0
投票

您似乎遇到了意外行为,即在 Web 视图中进行身份验证后,cookie 自动添加到您的请求中,以及更改 RestTemplate 配置后请求失败的问题。让我们分解一下您的问题:

在 Web 视图中授权后,为什么、如何以及从何处将 Cookie 插入到我的请求中?

Web 视图很可能在身份验证时存储会话 Cookie,并自动将其包含在从同一 Web 视图实例发出的后续请求中。这种行为在使用 cookie 维护会话的 Web 应用程序中很常见。 webview 可能在内部处理会话管理,这就是为什么您没有明确看到任何添加标头的代码。

为什么将 RestTemplate 的配置更改为特定主机后,一切都出错了,请求开始失败?

当您将 RestTemplate 的配置更改为特定主机时,请求中包含的会话 cookie 似乎对该特定主机或上下文无效。这可能是由于各种原因造成的,例如 cookie 的域限制、会话过期或应用程序不同部分之间的会话管理差异。

发生什么事了?

Webview 身份验证过程和 RestTemplate 请求之间的会话管理处理方式似乎可能存在差异。 Web 视图可能会独立于您的手动请求来管理会话,这就是您在使用 RestTemplate 时看到意外行为的原因。

© www.soinside.com 2019 - 2024. All rights reserved.