我有一个使用 Spring Security 来保护网页的 Spring Boot 应用程序。我还尝试从测试应用程序以编程方式登录到该页面。
应用程序在其自身运行时按其应有的方式运行。当有人尝试访问其网页时,它会提示输入用户名和密码(目前使用默认登录页面)以及用户何时输入正确的凭据。
受保护的 URL 是:
http://localhost:8080
用户凭据是:
username: factor3
password: testing123
不幸的是,当我尝试将凭据发布到我的应用程序时,我遇到了 401 失败。
发布到我页面的应用程序使用的是 okhttp 客户端 (v3)。它使用登录页面发送的相同参数生成对登录的 HTTP POST 请求(以与登录页面相同的方式):
public void sendPostRequest()
{
RequestBody body = new FormBody.Builder()
.add("username","factor3")
.add("password","testing123")
.build();
OkHttpClient client = singleClient.newBuilder()
.readTimeout(RST_TIMEOUT,TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("Authorization",Base64.getEncoder().encode("factor3:testing123".getBytes()).toString())
.url("http://localhost:8080/")
.post(body)
.build();
try
{
Response response = client.newCall(request).execute();
if(response.isSuccessful())
{
MediaType type = response.body().contentType();
// print out the contents of the response.
}
else
{
log.error("Post FAILED: "+response.code();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
请注意,根据我在其他 Stack Overflow 帖子中获得的一些信息,我添加了请求构建器中的“授权”标头。
此代码中的某些内容似乎失败了,因为我不断收到从 Spring Security 返回的 401 未经授权的错误。
我在这里做错了什么?我怎样才能让它正常工作?
附录:
我一直在我的 Spring Boot 应用程序中调试过滤器链,查看 BasicAuthenticationFilter 类(我目前正在使用基本身份验证)。此过滤器查找“授权”标头以处理用户的凭据。
看来,尽管我实际上在 POST 请求中添加了 Authorization 标头,但过滤器没有找到它!这似乎最终导致 401 失败返回到我的测试应用程序。
带有标头的 okHTTP 发布有问题吗?看起来标头在发出请求和到达 BasicAuthenticationFilter 之间以某种方式“丢失”了...