在上一篇文章中,我向您展示了如何在Java应用程序中启用Spring安全性 ,今天我们将讨论如何使用Spring Security 在Java Web应用程序中启用Basic HTTP身份验证 。 如果您使用的是Spring Security 3.1或更低版本,我将向您展示如何同时使用Java配置和XML配置,但是在此之前,让我们了解一下
什么是Http基本身份验证 ,为什么需要它? 在Web应用程序中对用户进行身份验证的最常见方法之一是使用表单登录,即,您提供登录页面,用户将输入其用户名和密码进行身份验证。 这对人类用户非常有用,但是有时您无法使用登录表单进行身份验证。
例如,如果您的应用程序用户不是人类用户或其他应用程序,则不适合使用表单登录。 例如,在RESTful Web服务客户端不是人工的情况下,而不是在其他服务器上运行某些其他应用程序的情况下,这也很常见。
在许多这样的场景中,您的客户端不是人工的,而是其他系统,例如,所有JMS客户端在没有用户交互的情况下生成和使用消息,并且ESB系统集成应用程序也是如此。
如果您正在处理这种情况,那么您需要考虑启用身份验证而不是表单登录。 在那种情况下,使用HTTP Basic身份验证来验证服务用户是有意义的。
HTTP基本身份验证如何工作
如果使用HTTP基本身份验证,则不使用表单,而是在HTTP请求标头上传递用户登录凭据,恰好是“授权”请求标头。 该标头允许您将用户名和密码发送到请求标头中,而不是在请求正文中发送,就像表单登录身份验证一样。 这是验证REST客户端的理想选择。
启用HTTP基本身份验证后,正在发送请求的客户端(例如,浏览器或REST客户端)将用户名和密码连接在一起,并在它们之间使用冒号,然后使用Base64编码对所得字符串进行编码。 然后将此字符串发送到请求的“ Authorization”标头中。
例如,如果您的REST客户端使用用户名"userId"
和密码"passwd"
,则客户端将创建字符串"userId:passwd"
并以64为基数对其进行编码,然后再将其发送到Authentication标头中。
当此请求到达服务器时,服务器将提取Authorization标头的值,并使用base64算法对密码进行解码并验证用户身份。
如果请求没有身份验证标头,则服务器将拒绝请求并返回401响应,并附加标头"WWW-Authenticate
: Basic realm"
以指示客户端需要在请求标头中发送用户名和密码以进行身份验证。
如果使用浏览器,它将读取该响应并显示一个登录对话框,以允许您输入用户名和密码。 顺便说一句,这不是发送登录凭据的最安全的方法,因为您看到的只是基于64位的编码。
有更好的方法来对用户进行身份验证,例如,使用Spring 5中引入的摘要身份验证和OAuth 2.0。稍后我将详细介绍,但如果您有兴趣,可以查看
Baeldung提供的Spring Security认证课程 ,以进一步了解它们。
如何使用XML配置在Spring Security中启用Http基本身份验证
如果您正在使用XML配置文件在应用程序中启用Spring安全性或在Spring security 3.1或更低版本上工作,则可以使用<http-basic />
配置元素在Java Web应用程序中启用Http基本身份验证。
如果使用表单登录,则可以将配置文件applicationContext-security.xml
的<login-form>
元素替换为<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 Master Class进行学习。
3) <intercept-url pattern="/**" access="isAuthenticated()" />
表示所有URL都需要认证,并且它们将使用HTTP基本认证机制。
4)身份验证管理器不是重点,但在这里我们使用的是内存中身份验证提供程序,其中仅配置了一个用户,用户名为"userId"
,密码为"passwd"
。
我们还可以使用Java配置启用相同的HTTP基本身份验证,让我们看看。
如何在Spring Security中使用Java配置启用Http Basic身份验证
如果是Java配置,则可以配置调用方法的安全性,如下所示。 使用Java配置启用HTTP Basic身份验证就像调用
httpBasic()
对象上的httpBasic configure()
方法传递给configure()
方法。
这是启用HTTP基本身份验证代码的Spring Security配置的典型示例:
@Configuration
@EnableWebSecurity
public class HttpBasicAuthenticationAdapter extendsWebSecurityConfigurerAdapter {@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth)throws Exception {auth.inMemoryAuthentication().withUser("userId").password("passwd").authorities("ROLE_USER");}@Overrideprotected 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课程学习Spring Security MasterClass和REST 。
他分享了他在使用Spring Framework和Spring Security开发RESTful Web服务方面的实际工作经验。
无论如何,这是一个很好的图表,解释了HTTP基本身份验证的工作原理,是阅读本文后记住此概念的一个很好的图表:
这就是如何在Spring Security中启用HTTP基本认证 。 您已经学习了XML和Java配置,以使用Spring安全性启用Http基本认证。 就像我说的那样,如果您正在使用Spring MVC开发RESTful Web服务,那么您需要了解如何通过使用Java代码或XML配置来启用HTTP基本身份验证以及其工作方式。 即使不利于生产,它对于测试和质量检查目的也非常有帮助。
您可能想探索的其他Spring Security文章和资源
学习Spring Security 4 Basic动手
学习Spring Security 4中级–动手
Spring MVC中@RestController和@Controller之间的区别?
Spring中@ Service,@ Component和@Controller之间的区别?
Spring中@RequestParam和@PathVaraible之间的区别?
5门学习Spring Core,Spring MVC和Spring Boot的课程
3个在线课程,可以更好地学习Spring Security
如何使用Spring Security进行基于角色的访问控制
感谢您到目前为止阅读本文,如果您喜欢本文以及我对如何在Spring Security中启用HTTP基本身份验证的解释,请与您的朋友和同事分享。
翻译自: https://www.javacodegeeks.com/2018/01/enable-http-basic-authentication-spring-security-using-java-xml-config.html