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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaIO流(2)--IO流原理、流的分类及节点流文件流操作

文章目录IO流简介IO流原理流的分类IO 流体系节点流和处理流节点流操作IO流简介 I/O是Input/Output的缩写&#xff0c; I/O技术是非常实用的技术&#xff0c;用于处理设备之间的数据传输。如读/写文件&#xff0c;网络通讯等。 Java程序中&#xff0c;对于数据的输入/输出操作…

linux权限体系有哪些角色,详解Linux下系统权限

一、权限概述1. 什么是权限权限&#xff1a;在计算机系统中&#xff0c;权限是指某个计算机用户具有使用软件资源的权利。软件资源&#xff1a;Linux系统中&#xff0c;一切皆文件&#xff01;SO&#xff0c;这里的软件资源就是文件资源。所以&#xff0c;我们今天所讲的权限&a…

试用期java_Java 7试用资源

试用期javaJava 7为完成使用后需要关闭的资源&#xff08;例如文件&#xff0c;流&#xff0c;数据库连接和套接字&#xff09;提供了更好的资源管理。 这种语言构造称为try-with-resources语句。 完成这项工作的机制称为AutoCloseable接口。 Java 7资源类均实现此接口。 该接口…

让你的对象跑出内存,写入到磁盘或者进行网络传输,一文掌握Java对象序列化

文章目录对象序列化是什么如何让对象可序列化让对象跑出内存对象序列化是什么 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流&#xff0c;从而允许把这种二进制流持久地保存在磁盘上&#xff0c;或通过网络将这种二进制流传输到另一个网络节点。当其它程序获…

JDK 9:NotNullOrElse方法已添加到Objects类

JDK 9向Objects类添加了一些新方法&#xff0c;包括本文中突出显示的两个static方法&#xff1a; requireNonNullElse&#xff08;T&#xff0c;T&#xff09;和requireNonNullElseGet&#xff08;T obj&#xff0c;Supplier <&#xff1f;extended T>供应商&#xff09;…

linux下删除只读文件,linux – 我无法删除文件’rm:无法删除X只读文件系统’

我正在尝试删除rdiff备份文件夹,因为备份过程中出现了一些问题,需要删除它的历史记录并重试.但是,当我跑&#xff1a;rm -r -f rdiff-backup-data我在一些文件上得到以下内容&#xff1a;rm: cannot remove X: Read-only file system这是我运行mount时得到的&#xff1a;/dev/s…

让你的数据和对象有源有出路,一文打尽,Java常用IO流处理流(处理字节流文件流)缓冲流、转换流、对象流等

文章目录缓冲流转换流标准输入输出流打印流数据流对象流随机存取文件流Java NIO缓冲流 为了提高数据读写的速度&#xff0c;Java API提供了带缓冲功能的流类&#xff0c;在使用这些流类时&#xff0c;会创建一个内部缓冲区数组&#xff0c;缺省使用8192个字节(8Kb)的缓冲区。 …

异步重试_异步重试模式

异步重试当您有一段经常失败且必须重试的代码时&#xff0c;此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案&#xff1a; ScheduledExecutorService scheduler Executors.newSingleThreadScheduledExecutor(); RetryExecutor executor new Async…

linux网卡e1000下载,Linux E1000网卡驱动分析

本分析主要针对e1000网卡,驱动源码为7.3.20-k2。本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制。Linux-千兆网卡驱动实现机制浅析作者: Minit, 出处:博客, 责任编辑: 罗丽艳,2009-03-29 00:001.引言本分析主要针对e1000网卡&#xff0c;驱动源码为…

迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

文章目录网络编程概述网络通信要素要素一IP和端口号要素二网络协议TCP网络编程UDP网络编程URL网络编程Java网络编程基础网络编程概述 Java是Internet上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 Java提…

Linux脚本双引号字符去除,shell命令去除字符串里双引号

echo \"refs/changes/84/727284/1\" | sed s/\"//gshell变量内字符替换和变量字符修改a12345123#将${a}里的第一个123替换为321b${a/123/321};echo "echo variable a"echo $aecho "echo variable b"echo $ba12345123#将${a}里的所有123替换…

一个小例子体会Java反射的动态性

背景&#xff1a;需要在程序运行时或者说某段代码运行后才能知道要创建哪个类的对象。 import java.util.Random;/*** Author: Yeman* Date: 2021-10-02-22:18* Description:*/ public class ReflectionTest {public static Object getInstance(String path) throws Exception…

Linux脚本让我选择文件,linux – 用于选择文件和打印文件大小的Awk脚本

我们在这看……select all regular files (not directories or links)到目前为止,你还没有解决这个问题,但如果你在ls -l …的输出中输入,这很容易,请选择/^-/因为目录以d开头,符号链接以l开头,依此类推.只有普通旧文件以 – 开头.现在print out the number of files followed好…

12000+字Java反射,一起全面了解Java反射机制,为学习框架铺路

文章目录Java反射机制理解Class类获取Class类实例类的加载过程类加载器ClassLoader创建运行时类的对象获取运行时类的结构调用运行时类的指定结构动态代理Java反射机制 Reflection是被视为动态语言的关键&#xff0c;反射机制允许程序在执行期借助于Reflection API取得任何类的…

坚实原则:Liskov替代原则

以前&#xff0c;我们深入研究了坚实的原则&#xff0c;包括单一责任和开放/封闭原则。 Liskov替代原则&#xff08;LSP&#xff09;是子类型关系的一种特殊定义&#xff0c;称为&#xff08;强&#xff09;行为子类型&#xff0c; 假设对象S是对象T的子类型&#xff0c;则可…

linux 中 id指令,Linux id 命令

要登入一台计算机&#xff0c;我们需要一个用户名。用户名是一个可以被计算机识别的身份。基于此&#xff0c;计算机会对使用这个用户名的登陆的人应用一系列的规则。在Linux系统下&#xff0c;我们可以使用 id 命令。什么是 id 命令id 命令可以显示真实有效的用户 ID(UID) 和组…

提高Java表达能力!不落伍一起掌握Java8中Lambda表达式、函数式接口及方法构造器数组引用

文章目录函数式接口概述函数式接口示例内置函数式接口Lambda简述Lambda语法方法引用构造器引用数组引用函数式接口概述 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 可以通过 Lambda 表达式来创建该接口的对象。 可以在一个接口上使用 FunctionalInterface 注解&…

linux启动weblogic指令,linux下如何启动和关闭weblogic .

在你定义的域中可以找到如下命令&#xff1a;/[youHome]/domains/[yourDomain]/startWebLogic.sh/[youHome]/domains/[yourDomain]/stopWebLogic.sh用telnet远程控制服务器&#xff0c; 远程启动WEBLOGIC服务&#xff0c;启动后关闭telnet&#xff0c;WebLogic服务也跟着停止&a…

一文一起,学习功能强大的Java8新StreamAPI,让集合的操作得心应手

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 文章目录Stream 概述Stream 实例化Stream 中间操作Stream 终止…

java erlang_Java开发人员的Erlang

java erlang您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 这是由于我的Soleus骨折了&#xff0c;而且我的腿是石膏模型。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那一天&#xff0c;要么看白天的电视&#xff0c;尽管Koj…