前言
在上一章中,我带你建立了第一个Spring Security项目,相信朋友们已经学会了如何使用Spring了 Security保护我们的Java Web项目。然而,第一个案例只属于HelloWorld入门级项目。我们仍然不知道SpringSecurity的具体使用细节。接下来,从认证方法入手,和大家一起学习如何进行各种认证。
一. Spring Security的认证方法1. 认证概念在编码之前,我们还是老规矩。首先,我们应该了解“认证”的概念。我们甚至不知道认证是什么意思,所以我们去编码。过了很长一段时间,我们不知道是什么。有什么力量。
认证: 所谓认证,就是判断系统中是否有用户,判断用户身份是否合法的过程,解决用户登录的问题。认证的存在是为了保护系统中的隐私数据和资源,只有合法用户才能访问系统中的资源。
2. 认证方式Spring 在Security中,常见的认证方法可分为HTTP水平和表单水平,常见的认证方法如下:
二. HTTP基础认证1. 基本认证概述
- ①. HTTP基础认证;
- ②. Form表格认证;
- ③. HTTP摘要认证;
在三种认证方法中,首先带你的朋友学习最简单的基本认证方法,看看基本认证是什么。
Spring Security 4.在x版本中,默认登录是HTTP的基本认证,弹出一个对话框,要求用户输入用户名和密码。在Authorization请求头中,每次进行基本认证请求时,都会使用Base64对 “用户:密码” 编码字符串。这种方法不安全,不适合Web项目,但它是一些现代主流认证的基础,在Spring 在Security的OAuth中,内部认证的默认方式是HTTP基本认证。
2. 核心API基础认证在我们知道了基本认证的概念后,我们也可以了解系统中涉及的各种核心应用程序及其执行过程。在本章中,我们首先对这些有一个基本的了解,然后在我与您分析源代码时详细说明这些。
简单的执行流程如下:
Filter->构造Token->AuthenticationManager->转到Provider处理->认证处理成功的后续操作或未通过抛异常复制代码
3. 基本认证步骤(重点)
HTTP基础认证是RFC2616标准中定义的一种认证模式,它以一种非常简单的方式与用户互动。HTTP基础认证可分为以下四个步骤:
- ①. 客户端首先发起未携带认证信息的请求;
- ②. 然后服务器端返回401 Unauthorized的响应信息,并在WWW-Authenticatication头部说明认证形式:进行HTTP基本认证时,WWW-Authentication将被设置为Basiccan realm=“受保护页面”;
- ③. 接下来,客户端将收到401 Unauthorized响应信息,弹出对话框,询问用户名和密码。用户输入后,客户端会用冒号拼接用户名和密码,然后用Base64编码,然后放入请求的Authorization头部,发送给服务器;
- ④. 最后,服务器终端解码客户端发送的信息,获取用户名和密码,验证判断信息是否正确,最后返回客户端响应内容。
对我们来说,我们应该熟练地记住和掌握上述基本认证步骤。如果我们不熟悉这个认证过程,就很难分解和处理每个环节。因此,我希望您能记住本节的知识点!
4. 基本认证的缺点我一直对我的学生说,“世界上没有完美的技术”,所以基础认证也有一些缺点。
HTTP基础认证是一种无状态的认证方法。与表格认证相比,HTTP基础认证是基于HTTP层面的认证方法,不能携带Session信息,也不能实现Remember-Me功能。此外,用户名和密码在传输过程中只制作了一个简单的Base64编码,几乎相当于用明文传输,很容易被密码窃听和重放攻击。因此,在实际开发中,这种认证方法很少用于安全验证。
三. 代码实现在学习了必要的理论知识后,请跟随您 实现代码。在上一个案例的基础上,我们对项目进行了改造。具体创建过程参考以上内容:《Spring Security系列教程03-创建SpringSecurity项目
1. 创建Securityconfig配置类别在这里,我们先创建一个名为securityconfig的config配置类,并继承了websecurityconfiguradapter父类,代码如下:
package com.yyg.security.config;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;/** * @Author: 一一哥 * @Blame: yyg * @Since: Created in 2021/4/14 */@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { //1.配置基本认证方法 http.authorizeRequests() ///认证任何请求 .anyRequest() .authenticated() .and() ///打开basic认证 .httpBasic(); }}
httpbasic()在这个代码中的方法是用来打开基本认证的。事实上,默认情况下是基本认证!
另外,在这个代码中,你可以发现我们使用了Java 链式调用 编程风格,有朋友知道链式编程符合哪种设计模式吗?
2. 代码结构事实上,核心代码只是上面的一小部分。让我们来看看代码的包结构。您可以随意创建项目名称。你不必和我的一样。
3. 启动项目然后我们启动项目,打开浏览器和调试窗口,然后访问我们自己的/hello接口。此时,我们可以看到一个登录窗口从浏览器中弹出。
提示我们输入我们的用户名和密码,并在认证成功后访问我们的web接口。
四. Basic认证详解我们已经实现了Basic的基本认证,所以我们将与您一起详细分析上述认证过程。
1. Basic Authorization这时,我们可以在浏览器调试窗口中查看响应头,看到WWWW-Authenticate认证信息:
WWW-Authenticate:Basic realm="Realm"
1.1 各响应信息的含义如下1.2 realm的概念
- WWW-Authenticate: 表示服务器通知浏览器进行代理认证。
- Basic: Basic认证表示认证类型。
- realm="Realm": 认证域名为Realm域。
realm="Realm": Realm是指认证域名,Realm是HttpBasic默认的Realm。当未经认证的用户要求不同的接口时,后台会根据分配给接口的域响应不同的realm名称,并使用不同的用户名/密码进行认证。因此,每次用户要求新的Realmurl时,弹出框都需要使用新的Realm用户名/密码进行认证,就像不同的角色只能要求属于该角色的url登录一样。
2. 基本认证过程此时响应码为401,请想想在什么情况下会导致401状态码? 你的高见可以在文章下面发表!如下图所示:
画重点,画重点,画重点!我们想知道基础认证是如何实现的,请往下看!
浏览器根据401及以上响应头信息弹出对话框,需要输入 Basic认证将用户名/密码拼接成 “用户名:密码” 格式,中间是冒号,用Base64编码成加密字符串xxx;然后将其添加到请求头中 Authorization: Basic xxx 信息,发送到后台认证;后台需要用Base64解码xxx,获取用户名和密码,然后进行验证 用户名:密码 信息。
- 如果认证错误,浏览器将保持弹框;
- 如果认证成功,浏览器将缓存有效的Base64编码,浏览器将在请求头中添加有效的编码。
以上是HTTP基础认证的内部执行过程,是一个重要环节。希望大家写下来!
3. 取消Basic认证成功认证后,Basic认证会在浏览器中缓存Authorization认证信息一段时间,然后每次请求接口都会自动带上,所以直到 只有当用户关闭浏览器时,认证信息才会被破坏,也就是说,我们不能有效地取消服务端。
但是,请求注销时,前端也可以手动使用 在请求头配置错误的Authorization,或在浏览器命令中执行 document.execuCommand("ClearAuthenticationCache")方法 清空认证信息,但这种方法对Chrome浏览器无效。在调试基本认证时,我们可以直接打开无痕模式,避免缓存引起的许多问题。
到目前为止,我们已经通过几行简单的代码实现了基本认证,并知道如何取消认证。你可以自己试试,看看是不是这样。你对这篇文章有什么想说的?