spring-boot - Spring Boot 应用程序的编程身份验证失败
问题描述
我有一个使用 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 之间以某种方式“丢失”......
解决方案
推荐阅读
- jquery - 我需要像 Playstore 中的滑块一样的 Android 滑块
- amazon-web-services - 用于跨 vpc 连接和 ssl 证书的 aws 专用区域
- sql-server - “sqlpackage.exe”不被识别为内部或外部命令错误
- c# - 将“平均”浮动百分之一
- php - 是否可以创建一个元素具有可变宽度的两行光滑滑块?
- linux - Linux 内核无法从 USB 挂载 rootfs
- java - 以下泛型代码有什么问题?
- ansible - Ansible 替换模块不起作用
- xcode - XCode 7.2.1 OpenGL Profiler:查看帧缓冲区内容
- bash - 从 docker 主机在 docker 容器内创建符号链接