在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标头应该只包含在请求中?这不应该是标准行为吗?
示例网址:
您的应用程序必须使用不同的包含目录和不同的域,请参阅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
标头。