在 WebLogic 上通过 HttpClient 进行身份验证时返回 401

401 Returned when authenticate via HttpClient on WebLogic

我在 WebLogic Application Server 12 中部署了基于 REST 的服务,它使用 Spring 安全性来使用 BASIC Auth 进行身份验证。以前我发现 WebLogic 有一个错误,如果请求中有授权 header,它会拦截调用。

我发现了一个非常有用的 link,它通过在 WebLogic 的 config.xml 中禁用 <enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials> 解决了这个问题。现在,如果我通过 POSTMan 访问我的服务,它运行良好并且 Spring 处理安全问题。

在此之后,我编写了一些使用 Apache Common HttpClient 库调用我的服务的自动化测试,但我不断从 WebLogic 收到 401 Unauthorized。我的客户端代码如下;

httpClient = new HttpClient();
        httpClient.getState().setCredentials(
            new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
            new UsernamePasswordCredentials(
                    getTestUsername(config.getUsername()), 
                    getTestPassword(config.getPassword()))
            );

我尝试将 auth pref 设置为 Basic,将 Authorization header 添加到我的请求中,甚至将 auth 设置为 Preemptoive 以 true 一切仍然相同。

有一件事我确定是 Weblogic 以某种方式拦截了我来自 Java 独立客户端的调用!因为在 Response Headers 中我得到 'realm: weblogic' 这是不正确的,因为它应该是 'realm: Spring Security Application',更奇怪的是我能够使用相同的安全凭证从 POSTMan 访问相同的 URL。我错过了什么吗?

是的,我确认 Weblogic 拦截了您的呼叫。

您必须在您的 weblogic config.xml 文件中将 <enforce-valid-basic-auth-credentials> 标记强制设置为 false。

请看Error adding enforce-valid-basic-auth-credentials to config.xml and http://www.dba-oracle.com/t_weblogic_bypass_basic_authentication.htm