![web.xml配置详解](https://img-blog.csdnimg.cn/img_convert/c16b5bb715b5c46b70c9098dd6256cb1.png)
web.xml配置详解
在上一篇文章中,我向您展示了如何在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"
并以base 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 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课程学习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 MVC中@RestController和@Controller之间的区别?
Spring中@ Service,@ Component和@Controller之间的区别?
Spring中@RequestParam和@PathVaraible之间的区别?
5门学习Spring Core,Spring MVC和Spring Boot的课程
如何使用Spring Security进行基于角色的访问控制
感谢您到目前为止阅读本文,如果您喜欢本文以及我对如何在Spring Security中启用HTTP基本身份验证的解释,请与您的朋友和同事分享。
web.xml配置详解