在上一篇文章中,我向您展示了如何在 Java 应用程序中启用 Spring 安全性,今天我们将讨论如何在您的 Java Web 应用程序中启用基本 HTTP 身份验证,使用Spring安全。如果您使用的是 Spring Security 3.1 或更低版本,我将向您展示如何使用 Java 配置和 XML 配置来做到这一点,但在此之前让我们了解什么是 Http 基本身份验证以及为什么需要那?在 Web 应用程序中验证用户身份的最常见方法之一是使用表单登录,即您提供一个登录页面,用户将输入他的用户名和密码进行身份验证。这对人类用户非常有用,但有时您无法使用登录表单进行身份验证。
例如,如果您的应用程序用户是非人类或其他应用程序,则表单登录是不合适的。这也很常见,例如 RESTful web 服务 客户端不是人类,而是运行在其他服务器上的其他应用程序。
在许多这样的场景中,您的客户不是人类而是其他系统,例如所有 JMS 客户端都无需用户交互即可生成和使用消息,ESB 系统集成应用程序也是如此。
如果您正在处理这些类型的场景,那么您需要考虑启用除表单登录之外的身份验证。在这些情况下,使用 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 安全性或使用 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 基本身份验证,让我们也看看。
在 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 MasterClass 和 REST 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