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

简介: 在上一章节中,一一哥 带大家搭建了第一个Spring Security项目,相信小伙伴已经学会了如何利用Spring Security来保护我们的Java Web项目。但是第一个案例只是属于HelloWorld入门级别的项目,关于SpringSecurity的具体使用细节,我们还有很多不了解的。接下来,一一哥 从认证方式开始,与各位一起学习如何进行各种认证。一. Spring Security的认证方式1. 认证概念在进行编码之前,我们还是老规矩,先了解一下"认证"的概念,不能连认证是啥意思都不知道,就去撸码,撸了半天都不知道撸的是什么,这有个什么劲啊。认证: 所谓的认证,就是用来判

前言

在上一章节中,一一哥 带大家搭建了第一个Spring Security项目,相信小伙伴已经学会了如何利用Spring Security来保护我们的Java Web项目。但是第一个案例只是属于HelloWorld入门级别的项目,关于SpringSecurity的具体使用细节,我们还有很多不了解的。接下来,一一哥 从认证方式开始,与各位一起学习如何进行各种认证。

一. Spring Security的认证方式

1. 认证概念

在进行编码之前,我们还是老规矩,先了解一下"认证"的概念,不能连认证是啥意思都不知道,就去撸码,撸了半天都不知道撸的是什么,这有个什么劲啊。

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

2. 认证方式

在Spring Security中,常见的认证方式可以分为HTTP层面和表单层面,常见的认证方式如下:

  • ①. HTTP基本认证;
  • ②. Form表单认证
  • ③. HTTP摘要认证;

二. HTTP基本认证

1. 基本认证概述

在3种认证方式中,一一哥 先带各位小伙伴来学习最简单的基本认证方式,看看基本认证又是个什么情况。

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

2. 基本认证核心API

我们知道了基本认证的概念之后,还可以再了解一下基本认证时,系统中所涉及到的各种核心API及其执行流程,在本章节中,我们先对这些有基本了解即可,等后面我跟各位分析源码时,再对这些细说。

简单的执行流程如下:

Filter->构造Token->AuthenticationManager->转给Provider处理->认证处理成功后续操作或者不通过抛异常

3. 基本认证步骤(重点)

HTTP基本认证是在RFC2616标准中定义的一种认证模式,它以一种很简单的方式与用户进行交互。HTTP基本认证可以分为如下4个步骤:

  • ①. 客户端首先发起一个未携带认证信息的请求;
  • ②. 然后服务器端返回一个401 Unauthorized的响应信息,并在WWW-Authentication头部中说明认证形式:当进行HTTP基本认证时,WWW-Authentication会被设置为Basic realm=“被保护的页面”;
  • ③. 接下来客户端会收到这个401 Unauthorized响应信息,并弹出一个对话框,询问用户名和密码。当用户输入后,客户端会将用户名和密码使用冒号进行拼接并用Base64编码,然后将其放入到请求的Authorization头部并发送给服务器;
  • ④. 最后服务器端对客户端发来的信息进行解码得到用户名和密码,并对该信息进行校验判断是否正确,最终给客户端返回响应内容。

对于我们来说,以上的基本认证步骤,应该熟练记忆掌握,如果我们对这个认证流程不熟悉,那么就很难做到针对各环节做出分解应对,所以本节知识点,一一哥 希望各位小伙伴要背下来哦!

4. 基本认证的弊端

一一哥 一直跟自己的学生说的一句话就是,"天下没有十全十美的技术",所以基本认证也存在着一定的弊端。

HTTP基本认证是一种无状态的认证方式,与表单认证相比,HTTP基本认证是一种基于HTTP层面的认证方式,无法携带Session信息,也就无法实现Remember-Me功能。另外,用户名和密码在传递时仅做了一次简单的Base64编码,几乎等同于以明文传输,极易被进行密码窃听和重放攻击。所以在实际开发中,很少会使用这种认证方式来进行安全校验。

三. 代码实现

学习完必要的理论知识之后,请各位小伙伴跟着 一一哥 进行代码实现吧。我们在上个案例的基础上,对项目加以改造,具体创建过程参考上文:《Spring Security系列教程03--创建SpringSecurity项目》

1. 创建SecurityConfig配置类

这里我们先创建一个config配置类,命名为SecurityConfig,并且继承自WebSecurityConfigurerAdapter父类,代码如下:

packagecom.yyg.security.config;
importorg.springframework.security.config.annotation.web.builders.HttpSecurity;
importorg.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/*** @Author: 一一哥* @Blame: yyg* @Since: Created in 2021/4/14*/@EnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter {
@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
//1.配置基本认证方式http.authorizeRequests()
//对任意请求都进行认证                .anyRequest()
                .authenticated()
                .and()
//开启basic认证                .httpBasic();
    }
}

这段代码中httpBasic()方法,就是用来开启基本认证的,其实默认采用的就是基本认证!

另外在这段代码中,各位小伙伴可以发现,我们采用了Java中 链式调用 的风格进行编程,有小伙伴知道链式编程符合哪种设计模式吗?

2. 代码结构

其实核心代码就上面一小段,我们来看看代码的包结构吧,项目名称各位随便创建,不一定非要和我的一样。

3. 启动项目

接着我们把项目启动起来,打开浏览器及调试窗口,然后访问自己的/hello接口,这时候我们就可以看到浏览器中弹出了一个登陆窗口。

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

四. Basic认证详解

我们上面已经实现了Basic基本认证,那么接下来 一一哥 和各位一起来对上面的认证过程进行详细的分析。

1. Basic Authorization

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

WWW-Authenticate:Basic realm="Realm"

1.1 各响应信息含义如下

  • WWW-Authenticate: 表示服务器告知浏览器进行代理认证工作。
  • Basic: 表示认证类型为Basic认证。
  • realm="Realm": 表示认证域名为Realm域。

1.2 realm的概念

realm="Realm": 指认证域名为Realm,HttpBasic默认的realm名为Realm。在未认证用户请求不同的接口时,后台会根据分配给该接口的域,响应不同的realm名称,并且用不同的用户名/密码进行认证。所以用户每请求一个新的Realm的url,都会弹框要求使用新的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浏览器无效。我们在调试基本认证时,可以直接开启无痕模式,避免很多因为缓存造成的问题。

到此为止,我们通过几行简单的代码,就实现了基本认证,并且知道了如何注销认证,各位小伙伴可以自己动手试试,看看是不是这样。对于本篇内容,你有什么想说的呢?

相关文章
|
17天前
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
Spring Retry 教程
|
2月前
|
Java 数据库连接 Spring
一文讲明 Spring 的使用 【全网超详细教程】
这篇文章是一份全面的Spring框架使用教程,涵盖了从基础的项目搭建、IOC和AOP概念的介绍,到Spring的依赖注入、动态代理、事务处理等高级主题,并通过代码示例和配置文件展示了如何在实际项目中应用Spring框架的各种功能。
一文讲明 Spring 的使用 【全网超详细教程】
|
2月前
|
SQL 存储 小程序
【教程】navicat配合HTTP通道远程连接SQLite数据库
本文介绍了如何通过 Navicat Premium 工具配合 n_tunnel_sqlite.php 和 HTTP 通道远程连接服务器上的 SQLite 数据库。SQLite 是一种自给自足的、无服务器的 SQL 数据库引擎,由于其端口未对外开放,直接使用 Navicat 进行远程连接不可行。文章详细记录了使用 HTTP 通道实现远程连接的过程,包括定位本地 `ntunnel_sqlite.php` 文件,将其上传至服务器,并通过 Navicat 配置 HTTP 通道连接 SQLite 数据库的具体步骤。
53 0
【教程】navicat配合HTTP通道远程连接SQLite数据库
|
2月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
61 0
|
3月前
|
Java Spring
spring restTemplate 进行http请求的工具类封装
spring restTemplate 进行http请求的工具类封装
106 3
|
3月前
|
存储 网络安全 数据安全/隐私保护
[flask]使用mTLS双向加密认证http通信
【7月更文挑战第16天】在Flask应用中实现mTLS双向TLS加密认证可增强HTTP通信安全性。步骤包括: 1. 使用OpenSSL为服务器和客户端生成证书和密钥。 2. 配置Flask服务器使用这些证书: - 安装`flask`和`pyopenssl`. - 设置SSL上下文并启用mTLS验证: 注意事项: - 保持证书有效期并及时更新. - 确保证书链信任. - 充分测试mTLS配置.
|
3月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
68 3
|
2月前
|
Java 关系型数据库 MySQL
|
3月前
|
Web App开发 XML 缓存
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
【7月更文挑战第19天】Fiddler会话面板概览:Fiddler的会话列表显示HTTP请求的详细信息,包括ID、状态码、协议、主机名、URL、内容类型、大小、进程及自定义备注。颜色和图标标识状态,如红色表示错误,黄色为认证,蓝色是HTML响应。用户可右键列进行搜索、标记重复、隐藏或自定义列,如添加请求方法。通过界面或脚本可添加自定义列,如显示ServerIP。会话还可复制和保存,解决乱码问题需解码响应体。
62 0
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
|
2月前
|
安全 网络安全 数据安全/隐私保护
[flask]使用mTLS双向加密认证http通信
[flask]使用mTLS双向加密认证http通信
下一篇
无影云桌面