如何使用 Java 和 XML 配置在 Spring Security 中启用 HTTP 基本身份验证

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(96)   2024-06-11 06:20:10

在上一篇文章中,我向您展示了如何在 Java 应用程序中启用 Spring 安全性,今天我们将讨论如何在您的 Java Web 应用程序中启用基本 HTTP 身份验证,使用Spring安全。如果您使用的是 Spring Security 3.1 或更低版本,我将向您展示如何使用 Java 配置和 XML 配置来做到这一点,但在此之前让我们了解什么是 Http 基本身份验证以及为什么需要那?在 Web 应用程序中验证用户身份的最常见方法之一是使用表单登录,即您提供一个登录页面,用户将输入他的用户名和密码进行身份验证。这对人类用户非常有用,但有时您无法使用登录表单进行身份验证。

例如,如果您的应用程序用户是非人类或其他应用程序,则表单登录是不合适的。这也很常见,例如 RESTful web 服务 客户端不是人类,而是运行在其他服务器上的其他应用程序。

在许多这样的场景中,您的客户不是人类而是其他系统,例如所有 JMS 客户端都无需用户交互即可生成和使用消息,ESB 系统集成应用程序也是如此。

如果您正在处理这些类型的场景,那么您需要考虑启用除表单登录之外的身份验证。在这些情况下,使用 HTTP 基本身份验证对服务用户进行身份验证是有意义的。

HTTP 基本身份验证的工作原理

在 HTTP 基本身份验证的情况下,用户登录凭证不是使用表单,而是在 HTTP 请求标头上传递,准确地说是 “授权” 请求标头。此标头允许您将用户名和密码发送到请求标头而不是请求正文中,就像表单登录身份验证一样。这是对 REST 客户端进行身份验证的理想选择。

启用 HTTP 基本身份验证后,发送请求的客户端(例如浏览器或 REST 客户端)将用户名和密码用冒号连接起来,然后使用 Base64 编码 对结果字符串。然后将该字符串发送到请求的 “Authorization” 标头中。

例如,如果您的 REST 客户端使用用户名 "userId" 和密码 "passwd",客户端会创建字符串 "userId:passwd" 并在发送之前对其进行 base 64 编码在身份验证标头中。

当此请求到达服务器时,服务器会提取 Authorization 标头的值并使用 base64 算法 解码密码并验证用户身份。

如果请求没有 Authentication 标头,则服务器会拒绝带有 401 响应的请求,并且还会附加标头 "WWW-Authenticate: Basic realm" 以指示客户端需要在其中发送用户名和密码用于身份验证的请求标头。

如果您使用浏览器,那么它会阅读该响应并显示一个登录对话框以允许您输入用户名和密码。顺便说一句,这不是发送登录凭据的最安全方式,因为您可以看到它只是 base 64 编码。

有更好的方法来验证用户,例如通过使用 Spring 5 中引入的摘要身份验证和 OAuth 2.0。我稍后会写更多相关内容,但如果您有兴趣,可以查看 Baeldung 的 Spring Security Certification Class 以了解更多信息。

如何使用 XML 配置在 Spring Security 中启用 Http 基本身份验证

如果您使用 XML 配置文件在您的应用程序中启用 Spring 安全性或使用 Spring 安全性 3.1 或更低版本,您可以只使用 <http-basic /> 配置元素在您的 Java Web 应用程序中启用 Http 基本身份验证。

如果您使用表单登录,则可以将配置文件 <login-form> 中的 applicationContext-security.xml 元素替换为 <http-basic />

您还需要在配置文件中包含 Spring 安全命名空间并重新启动应用程序以选择此更改。如果您不熟悉什么是命名空间以及它如何帮助您编写简洁的配置文件,我建议您阅读 Craig Walls 的 Spring in Action 4th Edition。一本很棒的 Spring 框架入门书籍,它同时基于 Spring 安全性和 Spring 引导。

以下是启用 HTTP 基本身份验证 的示例 Spring 安全配置文件的样子:

applicationContext-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

<http pattern="/home" security="none"/>
<http use-expressions="true">
  <intercept-url pattern="/**" access="isAuthenticated()" />
  <http-basic />
</http>


<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="userId" password="passwd" authorities="ROLE_USER" />
    </user-service>
   </authentication-provider>
</authentication-manager>

</beans:beans>

Read more: http://javarevisited.blogspot.com/2018/01/how-to-enable-http-basic-authentication-spring-security-java-xml-configuration.html#ixzz54Qt8drKX

在这种情况下,唯一相关的信息是 <http-basic /> 标签,它为整个应用程序启用 HTTP 基本身份验证,但让我稍微解释一下配置:

1) 第一行说 /home 我们不需要任何安全性,所以任何人都可以访问它。

2) 第二行 <http> 表示我们使用的是 Spring 表达式语言,这就是为什么我们可以使用 isAuthenticated() 方法来拦截 url。如果你对Spring表达式语言不熟悉,可以先通过Spring大师班了解一下。

3) <intercept-url pattern="/**" access="isAuthenticated()" /> 表示所有URL 都需要认证,它们将使用HTTP 基本认证机制。

4) 身份验证管理器不是焦点,但这里我们使用内存中的身份验证提供程序,只配置了一个用户,其用户名是 "userId",密码是 "passwd"

我们还可以使用 Java 配置启用相同的 HTTP 基本身份验证,让我们也看看。

如何在 Spring Security 中使用 Java 配置启用 Http 基本身份验证

在 Java 配置的情况下,您可以配置调用方法的安全方面,如下所示。使用 Java 配置启用 HTTP Basic 身份验证就像在传递给 httpBasic() 方法的 HttpSecurity 对象上调用 configure() 方法一样简单。

下面是典型的Spring Security配置启用HTTP基本认证码的例子:

@Configuration
@EnableWebSecurity
public class HttpBasicAuthenticationAdapter extends
    WebSecurityConfigurerAdapter {

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth)
      throws Exception {
    auth
    .inMemoryAuthentication()
    .withUser("userId").password("passwd")
    .authorities("ROLE_USER");

  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/securityNone").permitAll()
    .anyRequest().authenticated()
    .and()
    .httpBasic()
    .realmName("Your App");

  }

}

您可以使用 and() 等连接器方法组合安全约束。如果您想关闭 HTTP 基本身份验证,只需删除对 httpBasic() 方法的调用即可。

顺便说一句,HTTP 基本身份验证不是最安全的身份验证方式,因为您知道您可以通过拦截流量和使用 Base64 算法来解码密码,但它适用于大多数常见需求,例如测试。

有更好的方法可以在生产或现实世界的 RESTful Web 服务中执行身份验证,例如摘要认证。我会在以后的帖子中写更多相关内容,但如果您等不及了,那么我建议您学习 Eugen Paraschiv 的 Spring Security MasterClassREST with Spring 课程。

他在那里分享了他在使用 Spring Framework 和 Spring Security 开发 RESTful Web 服务方面的实际工作经验。

无论如何,这里有一个很好的图表,它解释了 HTTP 基本身份验证的工作原理,在阅读本文后记住这个概念的一个很好的图表:

这就是关于如何在 Spring Security 中启用 HTTP 基本身份验证。您已经学习了 XML 和 Java 配置以使用 Spring 安全启用 Http 基本身份验证。正如我所说,如果您正在使用 Spring MVC 开发 RESTful Web 服务,那么您需要了解如何使用 Java 代码或 XML 配置启用 HTTP 基本身份验证及其工作原理。尽管它不利于生产,但它对测试和 QA 目的非常有帮助。

您可能想探索的其他 Spring Security 文章和资源

动手学习 Spring Security 4 Basic

学习 Spring Security 4 中级 – 实践

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

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

Spring 中@RequestParam 和@PathVaraible 的区别?

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

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

如何使用 Spring Security 进行基于角色的访问控制

感谢您到目前为止阅读这篇文章,如果您喜欢这篇文章和我关于如何在 Spring Security 中启用 HTTP 基本身份验证的解释,请与您的朋友和同事分享。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-enable-http-basic-authentication-spring-security-using-java-xml-config.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...