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

时间:2019-04-08 12:17:24

标签: spring-security basic-authentication

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

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

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

这将导致触发webapp的其他授权机制(即keycloak),因为它们期望Authorization标头内的有效令牌。我知道我可以以一种不尝试解释以“ Basic”开头的Authorization-Header的方式配置密钥斗篷,但是似乎造成这一难题的根本原因是,对于不请求的请求,发送了Header属于basic-auth URL。

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

示例网址:

  • localhost:8083 / myURL :我希望浏览器发送 身份验证标头
  • localhost:8083 / myURL / moreURL :我也希望浏览器发送 身份验证标头
  • localhost:8083 / someOtherURL :我不希望浏览器发送 身份验证标头,但是可以!
  • localhost:8083 / someOtherURL / moreURL :同样,浏览器发送 标题意外

1 个答案:

答案 0 :(得分:1)

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

  

2基本身份验证方案

     

[...]
  客户应假定所有路径的深度等于或大于深度   Request-URI的path字段中的最后一个符号元素也   处于“基本领域”值指定的保护空间内   当前的挑战。客户可以抢先发送   相应的授权标头,其中包含对资源的请求   该空间,而没有收到来自服务器的其他挑战。

另请参阅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标头。