Http Basic Authentication在Spring Security中使用详解

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(81)   2024-06-15 16:20:39

在上一篇文章中,您学习了如何在基于 Spring security 的 Java 应用程序中启用 Http 基本身份验证,现在我们将更进一步,了解 http 基本身份验证在 Spring security 中的工作原理。如果您还记得,当您使用 HTTP Basic 进行身份验证时,客户端(例如浏览器或休息客户端在 http 请求标头中发送登录凭据。标头恰当地命名为 "Authorization”,它包含基于 64 位编码的字符串,该字符串是通过使用冒号连接用户名和密码创建的。例如,如果用户名是 "johnsmith",密码是 "JOHN3214",那么在使用 base 64 编码算法编码之前,它们将被连接为 "johnsmith:JOHN3214"

服务器在收到此类请求时,会提取 "Authorization" 标头的值,并使用相同的 Base64 算法对该标头的内容进行解码,以对用户进行身份验证。

如果您还记得,我们在 XML 配置中使用 <http-basic>l; 或在 httpBasic() 对象上使用 HttpSecurity 方法来启用基本身份验证。

现在,让我们看看 Spring security 是如何支持 Http Basic Authentication 的,以及当它收到登录请求并且在服务器端启用了 Http basic authentication 时,Spring 安全空间是如何移动的。

Spring Security 如何处理 Http 基本认证请求

当您使用 <http-basic>l; 配置元素时,Spring Security 的 BasicAuthenticationFitler 就会出现,它主要检查传入的 HTTP 请求 是否包含 "Authorization" 标头,其值以“Basic”开头。

BasicAuthenticationEntryPoint 策略也在启动时配置到ExceptionTranslationFilter 中,这是处理请求所必需的,不包含“Authorization”标头。

当您向受保护的 URL 发出 http 请求时,例如/admin/users 来自浏览器而不添加“Authorization”标头,然后 Spring Security 抛出一个由 ExceptionTranslationFilter 处理的拒绝访问异常。

然后,此过滤器委托给AuthenticationEntryPoint 接口的特定实现strategy,在我们的例子中就是BaicAuthenticationEntryPoint

此类将标头“WWW-Authenticate: Basic real=”Spring Security Application”添加到响应中,然后将 HTTP 状态代码 401(未授权)发送到客户端,例如到您的浏览器,它知道如何处理此代码并相应地工作,即它显示一个对话框提示输入用户名和密码,如下所示:

当您输入用户名和密码并提交请求时,请求再次跟随过滤器链,直到到达 BasicAuthenticationFilter

此过滤器检查请求标头、以“Basic”开头的授权标头的位置,例如授权:基本 CDWhZGRpbjpvcGVuc2AzYW1l。

然后,BaicAuthentictionFilter 提取“Authorization”标头的内容,并使用 Base64 算法对登录凭据进行解码,从解码后的字符串中提取用户名和密码。

一旦有了该信息,过滤器就会创建一个 UsernamePasswordAuthenticationToken 对象,并将其发送到身份验证管理器以以标准方式进行身份验证。

如果你不知道AuthenticationManager 对spring security登录的作用,那么,你可以在Eugen的Learn Spring Security课程中了解更多。

身份验证管理器将要求身份验证提供程序(例如,在内存中,支持 JDBC 或基于 LDAP)检索用户,然后使用它创建一个身份验证对象。这个过程是标准的,并且独立于使用 HTTP basic 进行身份验证,例如也适用于摘要认证。

如果您使用 RESTful Web 服务,您还可以使用 curl 命令 发送带有“授权”错误的 HTTP 请求以进行 HTTP 基本身份验证。我发现 curl 是一种通过从命令行发送各种 HTTP 命令来测试 Web 服务的简单方法。

您还可以查看我的帖子如何测试 RESTful web 服务 以找出 curl 的一些实际示例,例如发送 post 请求,发送带有 HTTP 基本和摘要认证的请求等。

顺便说一句,正如我之前所说,基本身份验证并不安全,任何可以拦截请求的人都可以解码密码,因此它仅用于测试目的,而更复杂的摘要身份验证和 OAuth 用于实际应用程序,特别是如果你想保护你的 REST API。

我会在接下来的文章中告诉您更多关于保护 REST API 的信息,但如果您等不及了,我建议您查看 REST with Spring MasterClass,它最近针对 Spring Framework 5 和 Spring Security 5 进行了更新,如下所示出色地。

这就是关于 HTTP 基本身份验证如何在 Spring Security 中工作的全部内容。您已经看到了当 HTTP 请求命中请求基本身份验证的受保护 URL 时发生的完整工作流程。它基本上是 BasicAuthenticationFilter BasicAuthenticationEntryPoint 一起完成大部分工作。

其他 Spring Security 教程资源

动手学习 Spring Security 4 Basic

Spring MVC 中@RestController 和@Controller 的区别?

Spring 中@RequestParam 和@PathVaraible 的区别?

3 门在线课程,让你更好地学习 Spring Security

Spring中@Service、@Component、@Controller的区别?

学习 Spring Core、Spring MVC 和 Spring Boot 的 5 门课程

Eugen Paraschiv 的 Spring 安全认证课程

感谢阅读本文,如果您喜欢我对 Spring Security 中 Http Basic Authentication 工作原理的解释,请与您的朋友和同事分享这篇文章。如果您对反馈有任何疑问,请留言。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-http-basic-authentication-works-spring-security.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...