在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标头?反正这不是标准行为吗?
示例网址:
答案 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
标头。