Spring Boot 应用程序的编程身份验证失败

时间:2021-05-01 20:14:08

标签: spring-boot spring-security okhttp

我有一个使用 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 之间以某种方式“丢失”了...

0 个答案:

没有答案