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

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

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

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

这就像一个魅力,就像我请求该模式的URL时,浏览器提示我提供凭据,然后我可以访问该端点。但是,在成功授权此端点后,浏览器会发送带有“Basic ...”令牌的Authorization标头,即使对于与上述代码中配置的URL无关的URL请求也是如此。例如网站主页。

这会导致webapp的其他授权机制,即keycloak,因为它们期望Authorization标头内部存在有效令牌。我知道我可以用一种方式配置keycloak,它不会尝试解释以“Basic”开头的Authorization-Header,但似乎这个困境的根本原因是Header得到了发送请求而不是属于basic-auth URL。

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

示例网址:

  • localhost:8083 / myURL:我希望浏览器发送Authentication Header
  • localhost:8083 / myURL / moreURL:我还希望浏览器发送Authentication Header
  • localhost:8083 / someOtherURL:我不希望浏览器发送Authentication Header,但确实如此!
  • localhost:8083 / someOtherURL / moreURL:同样的事情,浏览器意外发送了Header
spring-security basic-authentication
1个回答
1
投票

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

2基本认证方案

[...] 客户端应该假设所有在Request-URI的路径字段中最后一个符号元素深度或更深的路径也在当前质询的Basic域值指定的保护空间内。客户端可以抢先发送相应的授权标头,其中包含该空间中的资源请求,而不接收来自服务器的另一个质询。

并且还看到Chromium source

// 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标头。

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