Http基本身份验证在Spring Security中如何工作?

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

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

如果您还记得的话,我们使用<http-basic>l; 在XML配置或httpBasic()上方法HttpSecurity目的是能够基本验证。

现在,让我们看一下Spring安全性如何确切地支持Http Basic身份验证,以及当它收到登录请求并在服务器端启用Http Basic身份验证时,事物如何在Spring安全性空间内移动。

Spring Security如何处理Http基本身份验证请求

当您使用<http-basic>l; 配置元素,Spring Security的BasicAuthenticationFitler出现在图中,它基本上检查传入的HTTP请求是否包含"Authorization"标头,并且其值以“ Basic”开头。

启动时还将BasicAuthenticationEntryPoint策略配置到ExceptionTranslationFilter中,该策略用于处理不包含“ Authorization”标头的请求。

当您从浏览器向受保护的URL(例如/admin/users发出http请求而未添加“ Authorization ”标头时,Spring Security会抛出一个由ExceptionTranslationFilter处理的拒绝访问的ExceptionTranslationFilter

然后,此过滤器将委派给AuthenticationEntryPoint接口的特定实现策略 ,在本例中为BaicAuthenticationEntryPoint

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

当您输入用户名和密码并提交请求时,请求再次遵循过滤器链,直到到达BasicAuthenticationFilter为止。

此过滤器检查请求标头,以“ Basic ”开头的Authorization标头的位置,例如Authorization:Basic CDWhZGRpbjpvcGVuc2AzYW11。

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

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

如果您不知道AuthenticationManager在Spring安全性登录中的作用,那么您可以在Eugen的Learn Spring Security课程中了解有关AuthenticationManager更多信息。

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

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

您还可以在我的文章中看到如何测试RESTful Web服务,以找到一些curl的实际示例,例如发送发布请求,使用HTTP基本和摘要身份验证发送请求等。

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

在接下来的文章中,我将告诉您更多有关保护REST API的信息,但是如果您迫不及待,建议您使用Spring MasterClass来检阅REST,Spring MasterClass最近也针对Spring Framework 5和Spring Security 5进行了更新。

这就是Spring Security内部HTTP基本身份验证如何工作的全部内容 您已经了解了HTTP请求命中受保护的URL并请求基本身份验证时发生的情况的完整工作流程。 基本上是BasicAuthenticationFilterBasicAuthenticationEntryPoint一起完成大部分工作。

其他Spring Security教程资源

学习Spring Security 4 Basic动手

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

Spring中@RequestParam和@PathVaraible之间的区别?

3个在线课程,可以更好地学习Spring Security

Spring中@ Service,@ Component和@Controller之间的区别?

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

Eugen Paraschiv的Spring安全认证课程

感谢您阅读本文,如果您喜欢我对Spring Security中Http Basic身份验证如何工作的解释,请与您的朋友和同事分享此文章。 如果您对反馈有任何疑问,请留下注释。

翻译自: https://www.javacodegeeks.com/2018/01/http-basic-authentication-works-spring-security.html

Spring Security配置身份验证和授权可以通过以下步骤实现: 1. 添加Spring Security依赖:在项目的pom.xml文件添加Spring Security的依赖项。 2. 创建Spring Security配置类:创建一个继承自WebSecurityConfigurerAdapter的配置类,并使用@EnableWebSecurity注解标记。 3. 配置身份验证:在配置类重写configure(AuthenticationManagerBuilder auth)方法,使用auth对象配置身份验证。可以使用内存、数据库或自定义的用户存储来进行身份验证。 4. 配置授权:在配置类重写configure(HttpSecurity http)方法,使用http对象配置授权规则。可以设置哪些URL需要进行身份验证,以及不同角色的用户可以访问哪些URL。 以下是一个示例代码,演示了如何在Spring Security配置身份验证和授权: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user") .password("{noop}password") .roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() .and() .formLogin() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login") .and() .csrf().disable(); } } ``` 上述代码,configure(AuthenticationManagerBuilder auth)方法配置了一个内存的用户存储,其用户名为"user",密码为"password",角色为"USER"。configure(HttpSecurity http)方法配置了授权规则,其"/admin/**"路径需要"ADMIN"角色才能访问,"/user/**"路径需要"USER"角色才能访问,其他路径需要进行身份验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值