Spring 安全性 - 基本身份验证标头针对所有 URL 发送,而不仅仅是针对安全端点发送



在Spring Security/Boot应用程序中,我为特定的URL模式配置了基本身份验证:

http.antMatcher(StringUtils.join("myURL", "/**")).authorizeRequests().anyRequest().authenticated().and().httpBasic().realmName("realmName");

这就像一个超级按钮,就像当我请求该模式的 URL 时,浏览器会提示我提供凭据,然后我可以访问该端点。 但是,在成功授权此端点后,浏览器会发送带有"基本..."的授权标头令牌,甚至对于与上述代码中配置的 URL 无关的 URL 的请求。例如网站主页。

这会导致 Web 应用的其他授权机制(即 keycloak)触发,因为它们需要授权标头中的有效令牌。我知道我可以配置keycloak,它不会尝试解释以"基本"开头的授权标头,但似乎这种困境的根本原因是标头是为不属于基本身份验证URL的请求发送的。

有什么方法可以告诉Spring Security/浏览器/任何人,如果请求是针对与配置http-basic的模式匹配的URL,则仅应将basic-auth授权标头包含在请求中?这不应该是标准行为吗?

示例网址:

  • 本地主机:8083/myURL: 我希望浏览器发送 身份验证标头
  • 本地主机:8083/myURL/moreURL: 我也希望浏览器发送 身份验证标头
  • 本地主机:8083/someOtherURL: 我不希望浏览器发送 身份验证标头,但它确实如此!
  • 本地主机:8083/someOtherURL/moreURL:同样的事情,浏览器发送 标题意外

您的应用程序必须使用不同的包含目录和不同的领域,请参阅 RFC 2617:

2 基本认证方案

[...]
客户端应假定所有路径都位于或深度为 请求 URI 的路径字段中的最后一个符号元素也 在基本领域值指定的保护空间内 当前的挑战。客户端可以抢先发送 具有资源请求的相应授权标头 该空间没有收到来自服务器的另一个质询。

另见铬源:

// Helper to find the containing directory of path. In RFC 2617 this is what
// they call the "last symbolic element in the absolute path".
// Examples:
//   "/foo/bar.txt" --> "/foo/"
//   "/foo/" --> "/foo/"

在您的情况下,包含目录是为您的某个应用程序/的。另一个应用程序位于该包含目录的子路径中。因此,您的浏览器会抢先将相同的Authorization标头发送到两个应用程序。

相关内容

最新更新