Spring Security教程-实现HTTP基本认证

发布时间:2023-04-28 09:23:39

前言

在上一章中,我带你建立了第一个Spring Security项目,相信朋友们已经学会了如何使用Spring了 Security保护我们的Java Web项目。然而,第一个案例只属于HelloWorld入门级项目。我们仍然不知道SpringSecurity的具体使用细节。接下来,从认证方法入手,和大家一起学习如何进行各种认证。

一. Spring Security的认证方法1. 认证概念

在编码之前,我们还是老规矩。首先,我们应该了解“认证”的概念。我们甚至不知道认证是什么意思,所以我们去编码。过了很长一段时间,我们不知道是什么。有什么力量。

认证: 所谓认证,就是判断系统中是否有用户,判断用户身份是否合法的过程,解决用户登录的问题。认证的存在是为了保护系统中的隐私数据和资源,只有合法用户才能访问系统中的资源。

2. 认证方式

Spring 在Security中,常见的认证方法可分为HTTP水平和表单水平,常见的认证方法如下:

  • ①. HTTP基础认证;
  • ②. Form表格认证;
  • ③. HTTP摘要认证;
二. HTTP基础认证1. 基本认证概述

在三种认证方法中,首先带你的朋友学习最简单的基本认证方法,看看基本认证是什么。

Spring Security 4.在x版本中,默认登录是HTTP的基本认证,弹出一个对话框,要求用户输入用户名和密码。在Authorization请求头中,每次进行基本认证请求时,都会使用Base64对 “用户:密码” 编码字符串。这种方法不安全,不适合Web项目,但它是一些现代主流认证的基础,在Spring 在Security的OAuth中,内部认证的默认方式是HTTP基本认证。

2. 核心API基础认证

在我们知道了基本认证的概念后,我们也可以了解系统中涉及的各种核心应用程序及其执行过程。在本章中,我们首先对这些有一个基本的了解,然后在我与您分析源代码时详细说明这些。

Spring Security教程-实现HTTP基本认证_用户名

简单的执行流程如下:

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. 代码结构

事实上,核心代码只是上面的一小部分。让我们来看看代码的包结构。您可以随意创建项目名称。你不必和我的一样。

Spring Security教程-实现HTTP基本认证_HTTP_02

3. 启动项目

然后我们启动项目,打开浏览器和调试窗口,然后访问我们自己的/hello接口。此时,我们可以看到一个登录窗口从浏览器中弹出。

Spring Security教程-实现HTTP基本认证_客户端_03

提示我们输入我们的用户名和密码,并在认证成功后访问我们的web接口。

四. Basic认证详解

我们已经实现了Basic的基本认证,所以我们将与您一起详细分析上述认证过程。

1. Basic Authorization

这时,我们可以在浏览器调试窗口中查看响应头,看到WWWW-Authenticate认证信息:

WWW-Authenticate:Basic realm="Realm"

Spring Security教程-实现HTTP基本认证_用户名_04

1.1 各响应信息的含义如下
  • WWW-Authenticate: 表示服务器通知浏览器进行代理认证。
  • Basic: Basic认证表示认证类型。
  • realm="Realm": 认证域名为Realm域。
1.2 realm的概念

realm="Realm": Realm是指认证域名,Realm是HttpBasic默认的Realm。当未经认证的用户要求不同的接口时,后台会根据分配给接口的域响应不同的realm名称,并使用不同的用户名/密码进行认证。因此,每次用户要求新的Realmurl时,弹出框都需要使用新的Realm用户名/密码进行认证,就像不同的角色只能要求属于该角色的url登录一样。

2. 基本认证过程

此时响应码为401,请想想在什么情况下会导致401状态码? 你的高见可以在文章下面发表!如下图所示:

Spring Security教程-实现HTTP基本认证_HTTP_05

画重点,画重点,画重点!我们想知道基础认证是如何实现的,请往下看!

浏览器根据401及以上响应头信息弹出对话框,需要输入 Basic认证将用户名/密码拼接成 “用户名:密码” 格式,中间是冒号,用Base64编码成加密字符串xxx;然后将其添加到请求头中 Authorization: Basic xxx 信息,发送到后台认证;后台需要用Base64解码xxx,获取用户名和密码,然后进行验证 用户名:密码 信息。

  • 如果认证错误,浏览器将保持弹框;
  • 如果认证成功,浏览器将缓存有效的Base64编码,浏览器将在请求头中添加有效的编码。

以上是HTTP基础认证的内部执行过程,是一个重要环节。希望大家写下来!

Spring Security教程-实现HTTP基本认证_HTTP_06

3. 取消Basic认证

成功认证后,Basic认证会在浏览器中缓存Authorization认证信息一段时间,然后每次请求接口都会自动带上,所以直到 只有当用户关闭浏览器时,认证信息才会被破坏,也就是说,我们不能有效地取消服务端。

但是,请求注销时,前端也可以手动使用 在请求头配置错误的Authorization,或在浏览器命令中执行 document.execuCommand("ClearAuthenticationCache")方法 清空认证信息,但这种方法对Chrome浏览器无效。在调试基本认证时,我们可以直接打开无痕模式,避免缓存引起的许多问题。

到目前为止,我们已经通过几行简单的代码实现了基本认证,并知道如何取消认证。你可以自己试试,看看是不是这样。你对这篇文章有什么想说的?

上一篇 CentOS7 FTP安装与配置
下一篇 Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题